题意:对于给定的两个有序数组,找出其中位数。
思路:两个数组已有序。求中位数需注意:奇数个数时中位数恰好在中间,偶数个数时为中间两数的均值。
所以对于两个有序数组,找第k小的数,对于两数组分别前k/2项,最大值小的一定是前k-1项中的数。然后特判一项的情况就好了。
代码:傻逼了,感觉以前做过的题,忘干净了,,且反应不过来。。
class Solution {
public:
double fid(int k,int al,int ar,int bl,int br,vector<int> &A, vector<int> &B){
if(al>ar) return B[bl+k-1];
if(bl>br) return A[al+k-1];
if( k == 1) {
if(A[al] <= B[bl] ) return A[al];
else return B[bl];
}
int mid = k/2;
int lena = min(ar-al+1,mid);
int lenb = min(br-bl+1,mid);
if(A[lena+al-1]<=B[lenb+bl-1]) return fid(k-lena,lena+al,ar,bl,br,A,B);
else return fid(k-lenb,al,ar,lenb+bl,br,A,B);
}
double findMedianSortedArrays(vector<int> &A, vector<int> &B) {
int n = A.size();
int m = B.size();
if((n+m)&1) return fid((n+m+1)/2,0,n-1,0,m-1,A,B);
else {return (fid((n+m)/2,0,n-1,0,m-1,A,B)+fid((n+m)/2+1,0,n-1,0,m-1,A,B))/2.0;}
}
};