将题目转化为 "Kth element in 2 sorted array" 的问题
if(m/2 + n/2) > k && a[m/2] > b[n/2] drop section 2
if(m/2 + n/2) > k && a[m/2] < b[n/2] drop section 4
if(m/2 + n/2) < k && a[m/2] > b[n/2] drop section 3
if(m/2 + n/2) < k && a[m/2] < b[n/2] drop section 1
代码:
class Solution {
public:
double findMedianSortedArrays(int A[], int m, int B[], int n) {
if((m+n) & 1) { // m+n is odd
return getKth(A, m, B, n, (m+n)/2+1);
} else {
return 1.0/2*(getKth(A, m, B, n, (m+n)/2)+ getKth(A, m, B, n, (m+n)/2 + 1) );
}
}
int getKth(int A[], int m, int B[], int n, int k) {
if(m <= 0) return B[k-1];
if(n <= 0) return A[k-1];
if(k <= 1) return min(A[0], B[0]);
if(A[m/2] > B[n/2]) {
if(m/2 + n/2 + 1 >= k) {
getKth(A, m/2, B, n, k);
} else {
getKth(A, m, B+n/2+1, n-(n/2+1), k-(n/2+1));
}
} else {
if(m/2 + n/2 + 1 >= k) {
getKth(A, m, B, n/2, k);
} else {
getKth(A+m/2+1, m-(m/2+1), B, n, k-(m/2+1));
}
}
}
};
总结
1. 第一次真正使用 A[], m 这种描述数组的方法. 的确, 这种方法比 int st, ed 要好, 毕竟少了个参数
2. 第一个判断条件是 a[m/2] > b[n/2]), 第二个判断条件是 (m/2 + n/2 +1). 第二个判断条件比较直观的是 m/2+n/2+2, 但 +1 的话能够更快的收敛, 因为这保证每次至少有 a[m/2] or b[n/2] 会被踢出