题目:leetcode
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)).
注意:当m+n为偶数时,此题的中位数是中间两个数的平均值。
分析:
1、令数组A始终为长度小的那个数。
2、考虑A为空,B不为空的情况。
3、m+n为偶数和奇数的情况要分开讨论。
4、此题有两种思路:一种是求两个有序数组的第k个数,这里k=(m+n)/2. 另一种思路是每次递归都在中位数的前后删除deletenum长度的数字(这个deletenum约等于数组A的长度的一半),直到数组A长度为2(这是递归的终止条件)。这里我使用第二种思路,特别要注意的是m==1 和 m==2的情况要单独讨论。第二种情况的时间复杂度为O(log(min(m,n))).
class Solution { public: double findMedianSortedArrays(int A[], int m, int B[], int n) { if(m>n) return findMedianSortedArrays(B,n,A,m); if(m==0) { if(n==0) throw exception(); if(n & 1) { return B[(n-1)/2]; } else { double m1=B[(n-1)/2],m2=B[(n-1)/2+1]; return (m1+m2)/2; } } int total=m+n; if(total & 1) return findMedianSortedArrays_up(A,0,m-1,B,0,n-1); else return ( findMedianSortedArrays_down(A,0,m-1,B,0,n-1)+findMedianSortedArrays_up(A,0,m-1,B,0,n-1) )/2.0; } //比较小的那个数作为中位数 double findMedianSortedArrays_up(int A[], int al,int ar, int B[], int bl,int br) { int lena=ar-al+1,lenb=br-bl+1; int mida=al+(ar-al)/2,midb=bl+(br-bl)/2; if(lena==1 || lena==2 ) { if(lena==1) return one_multiple_up(B,bl,br,A[al]); else { return two_multiple_up(A,al,ar,B,bl,br); } } else { int deletenum=lena&1?lena/2:lena/2-1; if( A[mida]==B[midb]) { return A[mida]; } else if( A[mida]<B[midb]) { return findMedianSortedArrays_up(A,mida,ar,B,bl,br-deletenum); } else { int offset=lena&1?0:1; return findMedianSortedArrays_up(A,al,mida+offset,B,bl+deletenum,br); } } } double one_multiple_up(int num[], int l,int r,int number) { int mid=l+(r-l)/2,len=r-l+1; if(num[mid]==number) { return num[mid]; } else if(num[mid]<number) { if(len & 1) { return num[mid]; } else { return min(number,num[mid+1]); } } else { if(len & 1) { if(len==1) { return number; } else { return max(number,num[mid-1]); } } else { return num[mid]; } } } double two_multiple_up(int A[], int al,int ar, int B[], int bl,int br) { int mida=al+(ar-al)/2,midb=bl+(br-bl)/2; int lenb=br-bl+1; if((A[al]==A[ar] && A[al]==B[midb]) || (A[al]<B[midb] && A[ar]>B[midb])) { return B[midb]; } else if(A[al]==B[midb] || A[ar]==B[midb]) { return B[midb]; } else if(A[ar]<B[midb]) { if(lenb &1) { return max(A[ar],B[midb-1]);/////// } else { if(lenb==2) return A[ar]; else { return max(B[midb-1],A[ar]); } } } else//A[al]>B[midb] { return min(B[midb+1],A[al]); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //比较大的那个数作为中位数 double findMedianSortedArrays_down(int A[], int al,int ar, int B[], int bl,int br) { int lena=ar-al+1,lenb=br-bl+1; int mida=al+(ar-al)/2,midb=bl+(br-bl)/2; if((lena & 1) == 0) { mida++; } if((lenb & 1) == 0) { midb++; } if(lena==1 || lena==2) { if(lena==1) return one_multiple_down(B,bl,br,A[al]); else { return two_multiple_down(A,al,ar,B,bl,br); } } else { int deletenum=lena&1?lena/2:lena/2-1; if( A[mida]==B[midb]) { return A[mida]; } else if( A[mida]<B[midb]) { int offset=lena&1?0:1; return findMedianSortedArrays_down(A,mida-offset,ar,B,bl,br-deletenum); } else { //int offset=lena&1?0:1; return findMedianSortedArrays_down(A,al,mida,B,bl+deletenum,br); } } } double one_multiple_down(int num[], int l,int r,int number) { int mid=l+(r-l)/2,len=r-l+1; if((len & 1) == 0) { mid++; } if(num[mid]==number) { return num[mid]; } else if(num[mid]<number) { if(len & 1) { if(len==1) { return number; } else { return min(number,num[mid+1]); } } else { return num[mid]; } } else { if(len & 1) { return num[mid]; } else { return min(number,num[mid-1]); } } } double two_multiple_down(int A[], int al,int ar, int B[], int bl,int br) { int lena=ar-al+1,lenb=br-bl+1; int mida=al+(ar-al)/2,midb=bl+(br-bl)/2; if((lena & 1) == 0) { mida++; } if((lenb & 1) == 0) { midb++; } if((A[al]==A[ar] && A[al]==B[midb]) || (A[al]<B[midb] && A[ar]>B[midb])) { return B[midb]; } else if(A[ar]<=B[midb]) { return max(A[ar],B[midb-1]); } else if(A[al]>=B[midb]) { if(lenb &1) { return min(B[midb+1],A[al]); } else { if(lenb==2) { return A[al]; } else { return min(B[midb+1],A[al]); } } } } };
【经典】Median of Two Sorted Arrays
原文地址:http://blog.csdn.net/bupt8846/article/details/44725121