[ツリーコード]101-javascript


📌 質問する


https://leetcode.com/problems/capacity-to-ship-packages-within-d-days

📌 に答える

/**
 * @param {number[]} weights
 * @param {number} days
 * @return {number}
 */
var shipWithinDays = function (arr, k) {
  let sum = arr.reduce((a, b) => a + b);
  let left = 1;
  let right = sum;
  let ans = Infinity;
  while (left <= right) {
    let mid = parseInt((left + right) / 2);
    let cnt = 1;
    let cur = 0;
    for (let i = 0; i < arr.length; i++) {
      if (arr[i] > mid) {
        cnt = Infinity;
        break;
      }
      if (cur + arr[i] <= mid) {
        cur += arr[i];
      } else {
        cnt++;
        cur = arr[i];
      }
    }
    if (cnt <= k) {
      if (mid < ans) {
        ans = mid;
      }
      right = mid - 1;
    } else {
      left = mid + 1;
    }
  }
  return ans;
};
✔アルゴリズム:二分探索
✔arrは箱ごとの重さの配列です.これは、コンベアのすべての包装がk日以内に出荷できるように、船舶の最小重量容量を返却しなければならない問題である.
✔典型的な二分探索問題は、左に重量の和を設定して開始します.
✔左側と右側の中央をmidに設定しarr[0]からナビゲートを開始します.
10004 midまで加算と超過を続け、cntは1増加し、curは現在のインデックスの重量に更新されます.
✔すべての探索が終了した場合、cntをkと比較し、k以下であればansと比較し、小さい場合はansを更新する.
✔cntがk以下の場合、右が減少し、cntがk以上の場合、左が増加します.
❗arr[i]がmidより大きい場合、現在のmidにカプセル化できないため、cntをinfinityに変更して中断する必要がある.
✔難易度:回復コード基準medium