1. 程式人生 > >LeetCode 004 Median of Two Sorted Arrays - Java

LeetCode 004 Median of Two Sorted Arrays - Java

min -type port 尋找 style 得到 over size cti

There are two sorted arrays nums1 and nums2 of size m and n respectively.

Find the median of the two sorted arrays. The overall run time complexity should be O(log (m+n)).

Example 1:

nums1 = [1, 3]
nums2 = [2]
The median is 2.0

Example 2:

nums1 = [1, 2]
nums2 = [3, 4]
The median is (2 + 3)/2 = 2.5

定位:困難題

找到兩個數組的中位數,本身這道題不難,在經過將兩個數組歸並後就能較快找到中位數,這需要O(m+n)的時間復雜度,但題目中提出要使用O(long(m+n))的時間復雜度,難度由此而來,可以想到的是使用二分的思路。

同時,對於題目中我們要尋找中位數的問題我們優化為尋找兩個數組中第k大的數。我們當前的處理先為將數組A[m]與B[n]傳入,並保持m>n,我們對於當前A找到第k/2項為a,B也一樣為b,比較這兩個數的大小,在都找得到該項的情況下,有以下三種情況:

    1. a大於b,那麽我們當前可以保證B的前k/2項都小於目標數,將該部分剔除生成B‘,問題轉化為找A於B‘中第k/2大的數。
    2. a小於b,於上者類似,此時剔除A的前k/2項。
    3. a等於b,此時a與b的值就是目標數值。

上述情況可以進行遞歸,3為一種中止條件。

但是還存在一些問題,假如A沒有第k/2項,直接取到第m項,B就取k-m項。
如果此時A為空,直接返回B的第k項,如果k為1,比較A與B首項返回較小值。

Java實現:

 1 import java.util.Arrays;
 2 
 3 public class Solution {
 4     public double findMedianSortedArrays(int[] nums1, int[] nums2) {
 5         int len1=nums1.length;
 6         int
len2=nums2.length; 7 int total=len1+len2; 8 if(total%2==1) return findKth(nums1,len1,nums2,len2,total/2+1); 9 else return (findKth(nums1,len1,nums2,len2,total/2)+findKth(nums1,len1,nums2,len2,total/2+1))/2; 10 } 11 private double findKth(int[] nums1,int len1,int[] nums2,int len2,int k){ 12 if(len1>len2) return findKth(nums2,len2,nums1,len1,k); 13 if(len1==0) return (double)nums2[k-1]; 14 if(k==1) return Math.min(nums1[0],nums2[0]); 15 int now1=Math.min(k/2,len1); 16 int now2=k-now1; 17 if(nums1[now1-1]<nums2[now2-1]) return findKth(Arrays.copyOfRange(nums1,now1,len1),len1-now1,Arrays.copyOfRange(nums2,0,now2),now2,k-now1); 18 else if(nums1[now1-1]>nums2[now2-1]) return findKth(Arrays.copyOfRange(nums1,0,now1),now1,Arrays.copyOfRange(nums2,now2,len2),len2-now2,k-now2); 19 else return (double)nums1[now1-1]; 20 } 21 }

LeetCode 004 Median of Two Sorted Arrays - Java