天天看點

LeetCode 04:尋找兩個有序數組的中位數(Java實作)

LeetCode 04:尋找兩個有序數組的中位數(Java實作)

  • 題目

    給定兩個大小為 m 和 n 的有序數組 nums1 和 nums2。請你找出這兩個有序數組的中位數,并且要求算法的時間複雜度為 O(log(m + n))。你可以假設 nums1 和 nums2 不會同時為空。示例 1:nums1 = [1, 3],nums2 = [2],則中位數是 2.0示例 2:nums1 = [1, 2],nums2 = [3, 4],則中位數是 (2 + 3)/2 = 2.5來源:力扣(LeetCode)連結:https://leetcode-cn.com/problems/median-of-two-sorted-arrays著作權歸領扣網絡所有。商業轉載請聯系官方授權,非商業轉載請注明出處。

  • 思路1:将兩個數組連接配接,排序,找中位數
  • 代碼如下
public double findMediaSortedArrays(int[] nums1,int[] nums2){
  int l1 = nums1.length;
  int l2 = nums2.length;
  int[] nums = new int[l1+l2];
  
  if(l1==0){
   if(l2%2==0){
    return (nums2[l2/2-1]+nums2[l2/2])/2.0;
   }
   else return (nums2[l2/2]);  
  }
  if(l2==0){
   if(l1%2==0){
    return (nums1[l1/2-1]+nums1[l1/2])/2.0;
   }
   else return (nums1[l1/2]);  
  }
  
     int count = 0;
     int i = 0,j = 0;
     while(count<=l1+l2){
      if(nums1[i]<nums2[j]){
       nums[count++] = nums1[i++];
      }
      else nums[count++] = nums2[j++];
      
      if(i==l1){
       while(j!=l2){
       nums[count++] = nums2[j++];
       }
       break;
      }
      if(j==l2){
       while(i!=l1){
       nums[count++] = nums1[i++];
       }
       break;
      }
     }
     
     if(count%2==0){
     return (nums[count/2-1]+nums[count/2])/2.0;
     }
    else return (nums[count/2]); 
  }
 }
}
           
  • 注意事項、細節

    1、當兩個數組内元素數量之和(count)為偶數時,應該"/2.0"而不是"/2"。

    2、涉及了數組就要防止“溢出”,這題中涉及了多處容易“溢出”的地方,應格外小心。

  • 結果
    LeetCode 04:尋找兩個有序數組的中位數(Java實作)