public class Solution {
public double findMedianSortedArrays(int[] nums1, int[] nums2) {
int m = nums1.length, n = nums2.length;
int total = m + n;
if (total % 2 != 0) {
return findKth(nums1, 0, m - 1, nums2, 0, n - 1, total / 2 + 1);
} else {
double x = findKth(nums1, 0, m - 1, nums2, 0, n - 1, total / 2);
double y = findKth(nums1, 0, m - 1, nums2, 0, n - 1, total / 2 + 1);
return (double) (x + y) / 2;
}
}
private int findKth(int[] A, int aStart, int aEnd, int[] B, int bStart, int bEnd, int k) {
int m = aEnd - aStart + 1;
int n = bEnd - bStart + 1;
if (m > n) {
return findKth(B, bStart, bEnd, A, aStart, aEnd, k);
}
if (m == 0) {
return B[k - 1];
}
if (k == 1) {
return Math.min(A[aStart], B[bStart]);
}
int indexA = Math.min(k / 2, m);
int indexB = k - indexA;
if (A[aStart + indexA - 1] < B[bStart + indexB - 1]) {
return findKth(A, aStart + indexA, aEnd, B, bStart, bEnd, k - indexA);
} else if (A[aStart + indexA - 1] > B[bStart + indexB - 1]) {
return findKth(A, aStart, aEnd, B, bStart + indexB, bEnd, k - indexB);
} else {
return A[aStart + indexA - 1];
}
}
}