【leetcode】Median of Two Sorted Arrays

Median of Two Sorted Arrays

There are two sorted arrays A and B 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)).

 
 
 
 
最简单的,把两个数组组合到一起,然后排序,找到中位数,不过不符合复杂度要求
 
 1 class Solution {

 2 public:

 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {

 4        

 5         int i,j;

 6         vector<int> arr(m+n);

 7        

 8         for(i=0;i<m;i++)

 9             arr[i]=A[i];

10        

11         for(j=0;j<n;j++)

12             arr[m+j]=B[j];

13        

14         sort(arr.begin(),arr.end());

15        

16         if((m+n)%2==0)

17             return (arr[(m+n)/2]+arr[(m+n)/2-1])/2.0;

18         else

19             return arr[(m+n)/2];

20     }

21 };

 

 
 
解法二,不进行排序,直接在合并数组时确定顺序,不符合复杂度要求:
 
 1 class Solution {

 2 public:

 3     double findMedianSortedArrays(int A[], int m, int B[], int n) {

 4        

 5         int i,j,k;

 6         i=j=k=0;

 7        

 8         vector<int> arr(m+n);

 9         while(i<m||j<n)

10         {

11             int tmp;

12             if(i>=m)

13             {

14                 tmp=B[j];

15                 j++;

16             }

17             else if(j>=n)

18             {

19                 tmp=A[i];

20                 i++;

21             }

22             else if(A[i]<B[j])

23             {

24                 tmp=A[i];

25                 i++;

26             }

27             else

28             {

29                 tmp=B[j];

30                 j++;

31             }

32             arr[k]=tmp;

33             k++;

34         }

35        

36         if((m+n)%2==0)

37             return (arr[(m+n)/2]+arr[(m+n)/2-1])/2.0;

38         else

39             return arr[(m+n)/2];

40     }

41 };

 

 
 
解法三,通过在两个排列好的数列中寻找第K小的元素来寻找中位数
 
第1小,代表了最小的数   
 
 
首先假设数组A和B的元素个数都大于k/2,我们比较A[k/2-1]和B[k/2-1]两个元素,这两个元素分别表示A的第k/2小的元素和B的第k/2小的元素。这两个元素比较共有三种情况:>、<和=。如果A[k/2-1]<B[k/2-1],这表示A[0]到A[k/2-1]的元素都在A和B合并之后的前k小的元素中。换句话说,A[k/2-1]不可能大于两数组合并之后的第k小值,所以我们可以将其抛弃。
当A[k/2-1]>B[k/2-1]时存在类似的结论。

当A[k/2-1]=B[k/2-1]时,我们已经找到了第k小的数,也即这个相等的元素



 
 1 class Solution {

 2 public:

 3  

 4  int findKth(int A[],int m,int B[],int n,int k)

 5     {

 6           //为了后续计算方便,使得B的长度始终大于B的长度

 7         if(m>n)

 8         {

 9             return findKth(B,n,A,m,k);

10         }

11        

12         //如果第一个数组为空了,则返回第k小的数

13         if(m==0)

14         {

15             return B[k-1];

16         }

17        

18         //如果寻找第一小的数

19         if(k==1)

20         {

21             return min(A[0],B[0]);

22         }

23        

24         //第k/2个元素,或者是最后一个元素

25         int pa=min(m-1,k/2-1);

26         //保证A,B共取了k个元素

27         int pb=(k-(pa+1))-1;

28        

29         

30         if(A[pa]<B[pb])

31         {

32             //当排除了pa+1个元素后,则我们下一次寻找的就是k-(pa+1)大的元素了

33             return findKth(A+(pa+1),m-(pa+1),B,n,k-(pa+1));

34         }

35         else if(A[pa]>B[pb])

36         {

37             return findKth(A,m,B+(pb+1),n-(pb+1),k-(pb+1));

38         }

39         else if(A[pa]==B[pb])

40         {

41             return A[pa];

42         }

43     }

44  

45     double findMedianSortedArrays(int A[], int m, int B[], int n) {

46        

47         if((m+n)%2==0)

48             return (findKth(A,m,B,n,(m+n)/2)+findKth(A,m,B,n,(m+n)/2+1))/2.0;

49         else

50             return findKth(A,m,B,n,(m+n)/2+1);

51     }

52 };

 

 

你可能感兴趣的:(LeetCode)