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) {
if ((A.length + B.length) % 2 != 0) {
// 如果是奇数个,则中位数是第(m+n)/2+1个数
return findKth(A, 0, B, 0, (A.length + B.length) / 2 + 1);
} else {
// 如果是偶数,则是(m+n)/2 和 (m+n)/2+1 的平均值
return (findKth(A, 0, B, 0, (A.length + B.length) / 2) +
findKth(A, 0, B, 0, (A.length + B.length) / 2 + 1)) / 2;
}
}
private double findKth(int[] A, int indexA, int[] B,int indexB, int k) {
if (indexA >= A.length) { // A 为空
return B[indexB + k - 1];
}
if (indexB >= B.length) { // B 为空
return A[indexA + k - 1];
}
if (k == 1) { // 出口,k表示第k个,从1开始
return Math.min(A[indexA], B[indexB]);
}
// 分别找出两数组中的第 k/2 个数
double a = Integer.MAX_VALUE;
double b = Integer.MAX_VALUE;
if (indexA + k / 2 - 1 < A.length) {
a = A[indexA + k/2 - 1];
}
if (indexB + k / 2 - 1 < B.length) {
b = B[indexB + k / 2 - 1];
}
if (a < b) {
return findKth(A, indexA + k / 2, B, indexB, k - k / 2);
} else {
return findKth(A, indexA, B, indexB + k / 2, k - k / 2);
}
}
}