class Solution {
public:
int findkth(int* A, int m, int* B, int n, int k) {
if (m + n < k) {
return -1; //out of range
}
if (m == 0)
return B[k - 1];
if (n == 0)
return A[k - 1];
int m1 = m / 2, n1 = n / 2;
int v1 = A[m1], v2 = B[n1];
if (m1 + n1 + 2 > k) {
if (v1 >= v2) {
return findkth(A, m1, B, n, k);
} else {
return findkth(A, m, B, n1, k);
}
} else {
if (v1 >= v2) {
return findkth(A, m, B + n1 + 1, n - n1 -1, k - n1 - 1);
} else {
return findkth(A + m1 + 1, m - m1 - 1, B, n, k - m1 - 1);
}
}
}
double findMedianSortedArrays(int A[], int m, int B[], int n) {
if ((m + n) & 1) {
return findkth(A, m, B, n, (m + n + 1) / 2);
} else {
int v1 = findkth(A, m, B, n, (m + n) / 2);
int v2 = findkth(A, m, B, n, (m + n) / 2 + 1);
return double(v1 + v2) / 2;
}
}
};