public class Solution {
public double findMedianSortedArrays(int A[], int B[]) {
int m = A.length, n = B.length;
int total = m + n;
if ((total & 0x1) == 0x1){
return find(A, B, total/2); //start from 0.
}
return (find(A, B, total/2 - 1) + find(A, B, total/2)) / 2.0;
<span style="font-family: Arial, Helvetica, sans-serif;">}</span>
private double find(int A[], int B[], int k){
if (A.length > B.length) return find(B, A, k); //always deal with the first array is shorter.
if (A.length == 0) return B[k];
if (k == 0) return Math.min(A[0], B[0]);
int i = Math.min(k/2, A.length -1), j = k - (i + 1); // when A = {1}, B = {1}, k = 1, then i = 0, j must be 0!
if (A[i] < B[j]){
return find(Arrays.copyOfRange(A, i + 1, A.length), B, k - (i + 1)); // dump {A[0] ... A[i]}, so k minus (i + 1).
} else if (A[i] > B[j]){
return find(A, Arrays.copyOfRange(B, j + 1, B.length), k - (j + 1));
} else {
return A[i]; // because there is i elements before A[i] and j elements before B[j], and i + j = k -1,
//So there is already k - i element before A[i] and B[j], and A[i] == B[j], so we just return either A[i] or B[j].
}
}
}
另外的教訓是不要偷懶想copy自己的code片段,很容易copy完不改,又會出一堆錯誤!!邊界條件的經驗:自己run一些例子,從空的開始,找幾個corner case跑一跑,不要急着提交!!