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)).
思路:这里进一步寻找第k小的元素。(参考http://leetcode.com/2011/01/find-k-th-smallest-element-in-union-of.html)
每一步中取i+j=k-1,如果,Bj_1 <= Ai && Ai <= Bj或者Ai_1 <= Bj && Bj <= Ai,那么,Ai或者Bj为所求。如果A和B不满足这个条件,那么,可以去掉不可能的一般的元素,然后再剩下的元素中找。
int findKthSmallest(int A[], int m, int B[], int n, int k) {
assert(m >= 0); assert(n >= 0); assert(k > 0); assert(k <= m+n);
int i = (int)((double)m / (m+n) * (k-1));
int j = (k-1) - i;
assert(i >= 0); assert(j >= 0); assert(i <= m); assert(j <= n);
int Ai_1 = ((i == 0) ? INT_MIN : A[i-1]);
int Bj_1 = ((j == 0) ? INT_MIN : B[j-1]);
int Ai = ((i == m) ? INT_MAX : A[i]);
int Bj = ((j == n) ? INT_MAX : B[j]);
if (Bj_1 <= Ai && Ai <= Bj) // 反面是Ai > Bj或者Ai<Bj_1
return Ai;
else if (Ai_1 <= Bj && Bj <= Ai)// 剩下的反面是Ai > Bj且Ai_1 > Bj 或者Ai<Bj_1且Bj > Ai
return Bj;
assert((Ai >=Bj && Ai_1 >= Bj) || (Ai <=Bj && Ai <=Bj_1));
if (Ai <=Bj) //Ai<Bj_1和Bj,那么满足条件的i应该右移(Ai增大),j左移(Bj_1减小)
return findKthSmallest(A+i+1, m-i-1, B, j, k-i-1);
else
return findKthSmallest(A, i, B+j+1, n-j-1, k-j-1);
}
double findMid(int A[], int m, int B[], int n){
int a=m+n;
if(a%2!=0)
return findKthSmallest(A, m, B ,n,a/2+1);
else
return (findKthSmallest(A, m, B ,n,a/2)+ findKthSmallest(A, m, B ,n,a/2+1))/2.0;
}