要求时间是log(m+n)。递归实现。
所以用找第K大数的方法实现。
需要注意的边界条件是m<k/2的情况。
还有奇偶数的区别。
技巧是始终保证A数组比B数组的规模小。
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {int m=A.length;
int n=B.length;
if((m+n)%2==1)
return findk(A,B,m,n,(m+n)/2+1);
else
return (findk(A,B,m,n,(m+n)/2)+findk(A,B,m,n,(m+n)/2+1))*1.0/2;
}
public double findk(int A[],int B[],int m, int n,int k){
if(m>n)
return findk(B,A,n,m,k);
if(m<=0 && k>0)
return B[k-1];
else if(m<=0 && k<=0)
return B[0];
int[] remain=new int[n];
int i;
int mid=k/2;
if(mid==0)
{
if(A[mid]>=B[mid])
return B[mid];
else
return A[mid];
}
if(mid>m)
mid=m;
if(A[mid-1]>=B[mid-1])
{
for(i=mid;i<n;i++)
{
remain[i-mid]=B[i];
}
return findk(A,remain,m,n-mid,k-mid);
}
else
{
for(i=mid;i<m;i++)
{
remain[i-mid]=A[i];
}
return findk(remain,B,m-mid,n,k-mid);
}
}
}