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)).
O(m + n) solution:
public static float getMedian(int[] a, int[] b) {
if (a == null || b == null || (a.length + b.length) == 0) return Float.MIN_VALUE;
int pa = 0;
int pb = 0;
float median = 0;
while (pa + pb != (a.length + b.length + 1) / 2) {
int Ai = (pa == a.length) ? Integer.MAX_VALUE : a[pa];
int Bj = (pb == b.length) ? Integer.MAX_VALUE : b[pb];
if (Ai < Bj) {
median = a[pa];
pa++;
} else {
median = b[pb];
pb++;
}
}
if ((a.length + b.length) % 2 == 1) {
return median;
} else {
int Ai = (pa == a.length) ? Integer.MAX_VALUE : a[pa];
int Bj = (pb == b.length) ? Integer.MAX_VALUE : b[pb];
float median2 = (Ai < Bj) ? Ai : Bj;
return (median + median2) / 2;
}
}
O(log(m+n) solution:
public int findKthSmallest(int[] A, int[] B, int pa, int delta, int k) {
int pb = (k - 1) - pa;
int Ai_1 = ((pa == 0) ? Integer.MIN_VALUE : A[pa-1]);
int Bj_1 = ((pb == 0) ? Integer.MIN_VALUE : B[pb-1]);
int Ai = ((pa == A.length) ? Integer.MAX_VALUE : A[pa]);
int Bj = ((pb == B.length) ? Integer.MAX_VALUE : B[pb]);
if (Bj_1 <= Ai && Ai <= Bj) return Ai;
if (Ai_1 <= Bj && Bj <= Ai) return Bj;
if (Ai > Bj) {
pa = pa - delta;
if (((k - 1) - pa) > B.length) {
pa = k - 1 - B.length;
}
} else {
pa = pa + delta;
if (pa > Math.min(A.length, k - 1)) {
pa = Math.min(A.length, k - 1);
}
}
return findKthSmallest(A, B, pa, (delta + 1) / 2, k);
}
156

被折叠的 条评论
为什么被折叠?



