仍是須要看原始解釋,英文解釋,多看幾遍,多想一想,就明白了。中文的文章不夠清晰的。
leetcode.com/articles/me… 視頻 www.youtube.com/watch?v=LPF…數組
也可參考wiki:zh.wikipedia.org/wiki/%E4%B8…bash
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
} else if (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];
} else if (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];
} else if (j == n) {
minRight = A[i];
} else {
minRight = Math.min(B[j], A[i]);
}
// 偶數,返回平均值
return (maxLeft + minRight) / 2;
}
}
return 0;
}
複製代碼
原來是從第一個紅線換算得出的:ui
代碼中其實就是:
var j = halfLen - i; // halfLen = Math.floor((m + n + 1) / 2);
由於一開始是用隨機數i來切分數組的,以下圖:spa
初步以爲是一開始要求0<i<m,而條件1中是i=m或i=0,因此條件2和條件3確定是i<m和i>0。 翻譯
不用j>0和j<n條件,下面有解釋了:(從i<m可得出j>0;從j>0可得出j<n)