var findMedianSortedArrays = function(A, B) {
var m = A.length;
var n = B.length;
if (m > n) { // to ensure m<=n
var temp = A;
A = B;
B = temp;
var tmp = m;
m = n;
n = tmp;
}
var iMin = 0,
iMax = m,
halfLen = Math.floor((m + n + 1) / 2);
while (iMin <= iMax) {
var i = Math.floor((iMin + iMax) / 2);
var j = halfLen - i;
if (i < iMax && B[j - 1] > A[i]) {
iMin = i + 1; // i is too small
} elseif (i > iMin && A[i - 1] > B[j]) {
iMax = i - 1; // i is too big
} else { // i is perfect
var maxLeft = 0;
if (i == 0) {
maxLeft = B[j - 1];
} elseif (j == 0) {
maxLeft = A[i - 1];
} else {
maxLeft = Math.max(A[i - 1], B[j - 1]);
}
if ((m + n) % 2 == 1) { // 若是奇數,則直接返回maxLeft;否則,則找到minRight
return maxLeft;
}
var minRight = 0;
if (i == m) {
minRight = B[j];
} elseif (j == n) {
minRight = A[i];
} else {
minRight = Math.min(B[j], A[i]);
}
// 偶數,返回平均值
return (maxLeft + minRight) / 2;
}
}
return 0;
}
複製代碼
5 其餘
1 爲何會有第二個紅線的公式?
原來是從第一個紅線換算得出的:ui
代碼中其實就是:
var j = halfLen - i; // halfLen = Math.floor((m + n + 1) / 2);