中位數 - Median of Two Sorted Arrays[LeetCode]

image.png
仍是須要看原始解釋,英文解釋,多看幾遍,多想一想,就明白了。中文的文章不夠清晰的。

1 詳解過程:

leetcode.com/articles/me… 視頻 www.youtube.com/watch?v=LPF…數組

2 定義:

image.png

3 本身翻譯下 - 中位數特色:

  1. 把一個集合分割爲長度相等的子集
  2. 其中一個子集元素老是大於另外一個

也可參考wiki:zh.wikipedia.org/wiki/%E4%B8…bash

4 把答案整理爲js代碼:

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;
}
複製代碼

5 其餘

1 爲何會有第二個紅線的公式?

原來是從第一個紅線換算得出的:ui

image.png
代碼中其實就是: var j = halfLen - i; // halfLen = Math.floor((m + n + 1) / 2);

2 找到後,爲何奇數的中位數是比較最大值max(A[i-1],B[j-1]),而不是比較最小值min(A[i],B[j])?

image.png

由於一開始是用隨機數i來切分數組的,以下圖:spa

image.png

3 其餘兩個條件中,爲何要限定i<m和i>0?

初步以爲是一開始要求0<i<m,而條件1中是i=m或i=0,因此條件2和條件3確定是i<m和i>0。 翻譯

image.png
不用j>0和j<n條件,下面有解釋了:(從i<m可得出j>0;從j>0可得出j<n)
image.png

6 想法不定時更新

  1. 記得原來數組A和數組B是已經排好序的,因此只需比較A[i-1]<=B[j]和B[j-1]<=A[i]。由於A[i-1]確定小於等於A[i],B[j-1]確定小於等於B[j]。具體可參考視頻 www.youtube.com/watch?v=LPF… -- 0519 22.31
相關文章
相關標籤/搜索