珂珂吃香蕉(js二分查找法)

珂珂喜歡吃香蕉。這里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警衛已經離開了,將在 H 小時后回來。
珂珂可以決定她吃香蕉的速度 K (單位:根/小時)。每個小時,她將會選擇一堆香蕉,從中吃掉 K 根。如果這堆香蕉少于 K 根,她將吃掉這堆的所有香蕉,然后這一小時內不會再吃更多的香蕉。
珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。
返回她可以在 H 小時內吃掉所有香蕉的最小速度 K(K 為整數)。

輸入:

參數1:piles: number[] 數組里面的值代表每一堆香蕉的根數;
參數2: H: number 輸入警衛離開的時間;

輸出:

輸出最小速度K;

示例 1:

輸入: piles = [3,6,7,11], H = 8
輸出: 4

示例 2:

輸入: piles = [3,6,7,13], H = 8
輸出: 5

示例 3:

輸入: piles = [23,30,12, 4], H = 5
輸出: 23

示例 4:

輸入: piles = [23,30,12, 4], H = 6
輸出: 15

/**
   * @param piles{Array} 香蕉堆
   * @param H{number} 警衛離開的時間H
   * */
  function minEatingSpeed(piles, H) {
    if(H < piles.length) {
      return '離開時間不能小于香蕉堆數';
    }
    if (piles.length === 1) {//特殊情況,只有一個堆,可直接獲取時間
      return Math.ceil(piles[0] / H);
    }
    //按照香蕉數從小到大排序
    const sortPiles = piles.sort(function (a, b) {
      return a - b;
    });
    //初始化三個速度,最小速度,最大速度,中間速度
    let left = 1, right = sortPiles[sortPiles.length - 1], mid;
    while (left < right) {
      mid = Math.floor((left + right) / 2);//折中向下取整
      let needHours = 0;//計算以mid速度吃香蕉需要的總時間
      for (let pile of sortPiles) {
        //吃完一堆后,這一小時內不會再吃更多的香蕉,向上取整
        needHours += Math.ceil(pile / mid);
      }
      if (needHours > H) {
        //超過H,則說明我們吃慢了,增大左邊界
        left = mid + 1;
      } else {
        //否則縮小右邊界
        right = mid;
      }
    }
    return left;
  }
  const K = minEatingSpeed([3,6,7,11], 8);
  console.log("最小速度>>>>>>> ", K);

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 回顧二分搜索樹的定義 二分搜索樹的重要性質 二分搜索樹的重要性質如下,初學的時候經常會被忽略或者錯誤地理解: 左子...
    李威威閱讀 549評論 0 0
  • iOS 蘋果官方Demo合集 字數10517閱讀21059評論18喜歡144 其實, 開發了這么久, 不得不說, ...
    bingo居然被占了閱讀 10,259評論 2 31
  • 荷蘭房市目前正處于日新月異的變化之中。購房貸款利息超低,房價上漲,交易活躍。有大量人士加入買房的大軍。在這個日益升...
    榮若言閱讀 2,004評論 0 0
  • 在開發maven項目時,常常想了解maven的插件做了哪些工作,這時候就需要用到調試maven插件源碼 準備工作 ...
    碳頭tantou閱讀 2,492評論 0 50
  • 2018年元月12日下午上海五金商業行業協會年會在好美家裝潢建材有限公司熱烈舉行.中國五交化商業行業協會秘書長、北...
    無友不如己閱讀 298評論 0 0