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)).
[code]
public class Solution {
public double findMedianSortedArrays(int a[], int b[]) {
int m=a.length, n=b.length, k=(m+n)/2;
if( (m+n)%2==0 )
{
return ( (double)kth(a, 0, m-1, b, 0, n-1, k) + (double)kth(a,0,m-1,b,0,n-1,k+1) )/2;
}
else return (double)kth(a,0,m-1,b,0,n-1,k+1);
}
int kth( int[]a, int sa, int ea, int[]b, int sb, int eb, int k)
{
int m=ea-sa+1, n=eb-sb+1;
if(m>n)return kth(b,sb,eb,a,sa,ea,k);
if(m<=0)
{
return b[sb+k-1];
}
int mida=(sa+ea)/2, midb=(sb+eb)/2;
int ma=a[mida], mb=b[midb];
int half=mida+midb-sa-sb+2, offset;
if(k>half)
{
if(ma<mb)
{
offset=mida-sa+1;
return kth(a,mida+1,ea,b,sb,eb, k-offset);
}
else
{
offset=midb-sb+1;
return kth(a,sa,ea,b,midb+1,eb,k-offset);
}
}
else if(k<half)
{
if(ma<mb)return kth(a,sa,ea,b,sb,midb-1,k);
else return kth(a,sa,mida-1,b,sb,eb,k);
}
else if(k==half)
{
if(ma<mb)
{
offset=mida-sa+1;
return kth(a,mida+1,ea,b,sb,midb,k-offset);
}
else if(ma>mb)
{
offset=midb-sb+1;
return kth(a,sa,mida,b,midb+1,eb,k-offset);
}
else return ma;
}
return 0;
}
}
[Thoughts]
递归结束条件: 观察loop variant的改变情况.