[LintCode]Median of two Sorted Arrays
class Solution {
/**
* @param A: An integer array.
* @param B: An integer array.
* @return: a double whose format is *.5 or *.0
*/
public double findMedianSortedArrays(int[] A, int[] B) {
// 2015-4-21
if (A == null || B == null) {
return 0;
}
int len = A.length + B.length;
if (len == 0) {
return 0;
}
if (len % 2 == 0) {
// 偶数
return (findKth(A, B, 0, 0, len / 2)
+ findKth(A, B, 0, 0, len / 2 + 1)) / 2.0;
} else {
// 奇数
return findKth(A, B, 0, 0, len / 2 + 1);
}
}
// 在两个数组中找到第k大的数
private int findKth (int[] A, int[] B, int indexA, int indexB, int k) {
int lenA = A.length;
int lenB = B.length;
// 结束1:A中元素已全部被筛选掉
if (indexA == lenA) {
return B[indexB + k - 1];
}
// 结束2:B中元素已全部被筛选掉
if (indexB == lenB) {
return A[indexA + k - 1];
}
// 结束3:无论k是奇是偶,最后一定为1
if (k == 1) {
return Math.min(A[indexA], B[indexB]);
}
int mid = k / 2;
// 序号为index + k / 2 - 1的元素
int keyA = indexA + mid - 1 >= lenA ? Integer.MAX_VALUE : A[indexA + mid - 1];
int keyB = indexB + mid - 1 >= lenB ? Integer.MAX_VALUE : B[indexB + mid - 1];
// 每次筛掉k / 2个元素
if (keyA < keyB) {
// 从A筛掉k / 2
return findKth(A, B, indexA + mid, indexB, k - mid);
} else {
// 从B筛掉k / 2
return findKth(A, B, indexA, indexB + mid, k - mid);
}
}
}