There are 2 sorted arrays A and B of size n each. Write an algorithm to find the median of the array obtained after merging the above 2 arrays(i.e. array of length 2n). The complexity should be O(log(n))
最重要的是要理解为什么每次只能discard 1/4 of the two arrays in total.
public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
if ((A.length + B.length) % 2 == 1) {
return sub(A, 0, A.length - 1, B, 0, B.length - 1, (A.length + B.length)/2 + 1);
} else {
double r1 = sub(A, 0, A.length - 1, B, 0, B.length - 1, (A.length + B.length)/2);
double r2 = sub(A, 0, A.length - 1, B, 0, B.length - 1, (A.length + B.length)/2 + 1);
return (r1 + r2) / 2;
}
}
private double sub(int[] a, int al, int ar, int[] b, int bl, int br, int order) {
if (al > ar && bl > br) {
return 0;
}
if (al > ar || bl > br) {
return al > ar ? b[bl + order-1] : a[al + order-1];
}
int mida = (al + ar) / 2;
int midb = (bl + br) / 2;
if (a[mida] > b[midb]) {
if (order >= mida - al + midb - bl + 2) {
return sub(a, al, ar, b, midb+1, br, order - (midb - bl + 1));
} else {
return sub(a, al, mida - 1, b, bl, br, order);
}
} else {
if (order >= mida - al + midb - bl + 2) {
return sub(a, mida+1, ar, b, bl, br, order - (mida - al + 1));
} else {
return sub(a, al, ar, b, bl, midb - 1, order);
}
}
}
}