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)).
median基本上都是find kth smallest 的变种。 比如用random selection来解决 n th unordered array的问题,求median其实就是求n/2.
这个问题是find kth in two sorted array. 总之还是要先理解如何在find kth in two sorted array.
给定两个array A,B, 每次从A截取K/2, 当然,如果k/2> len(m),就截取m, 比较 pa-1,pb-1的大小,如果pa-1<pb-1,那么就可以放心的drop掉前面的部分 (pa)部分, 如果不是的话,那么就drop掉 B的pb部分。 另外的array全部包括。 这个地方写的时候有点糊涂是要不要取一半。后来想通了,是kth 不是median. 当然如果是median, 那边可以取一半。 递归到最后的终止条件, k=1, m=0,
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
int ind=m+n;
if (ind%2)
{
return find_kth(A,m,B,n,(m+n)/2+1);
}
else
return (find_kth(A,m,B,n,ind/2+1)+find_kth(A,m,B,n,ind/2))/2.;
}
/* find kth in two sorted array */
double find_kth(int A[], int m, int B[], int n, int k)
{
// keep m<n
if (m>n)
return find_kth(B,n,A,m,k);
// base 1: one small array contains nothing
if (m==0)
return B[k-1];
// base 2: only one left
if (k==1)
return min(A[0],B[0]);
int ind_A=min(k/2,m); // reduce k/2 for small array
int ind_B=k-ind_A;
if (A[ind_A-1]<=B[ind_B-1])
// drop k-ind_A
return find_kth(A+ind_A, m-ind_A,B,n,k-ind_A);
else// drop k-ind_B
return find_kth(A,m,B+ind_B,n-ind_B,k-ind_B);
}
};