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)).
参考:http://www.cnblogs.com/RazerLu/p/3533425.html
思路:转化成第K位数的形式,简单的说,就是或者丢弃最大中位数的右区间,或者丢弃最小中位数的左区间。
public class Solution {
public double findKth(int a[], int aBeg, int aEnd, int b[], int bBeg, int bEnd, int k){
if(aBeg > aEnd) return b[bBeg + k -1];
if(bBeg > bEnd) return a[aBeg + k -1];
int mida = (aBeg + aEnd) / 2;
int midb = (bBeg + bEnd) / 2;
int len = mida - aBeg + 1 + midb - bBeg + 1;
if(len <= k){//注意等于条件,让我找了半个小时的错
if(a[mida] < b[midb]){//在a的后半段和b中查找第k-(mida-aBeg+1)位
return findKth(a, mida+1, aEnd, b, bBeg, bEnd, k - (mida-aBeg+1));
}
else{
return findKth(a, aBeg, aEnd, b, midb+1, bEnd, k - (midb-bBeg+1));
}
}
else{
if(a[mida] < b[midb]){
return findKth(a, aBeg, aEnd, b, bBeg, midb-1, k);
}
else{
return findKth(a, aBeg, mida-1, b, bBeg, bEnd, k);
}
}
}
public double findMedianSortedArrays(int a[], int b[]) {
int lena = a.length;
int lenb = b.length;
int flag = (lena + lenb)%2;
if(flag == 0){
return (findKth(a, 0, lena-1, b, 0, lenb-1, (lena+lenb)/2) + findKth(a, 0, lena-1, b, 0, lenb-1, (lena+lenb) / 2 + 1)) / 2.0;
}
else{
return findKth(a, 0, lena-1, b, 0, lenb-1, (lena+lenb)/2 + 1);
}
}
}