美文网首页
珂珂吃香蕉(js二分查找法)

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

作者: lsh1992 | 来源:发表于2020-02-17 20:59 被阅读0次

    珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。
    珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
    珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
    返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。

    输入:

    第一行输入香蕉堆个数N;
    第二行输入N个数,代表每一堆香蕉的根数;
    第三行输入警卫离开的时间H;

    输出:

    输出最小速度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);
    
    

    相关文章

      网友评论

          本文标题:珂珂吃香蕉(js二分查找法)

          本文链接:https://www.haomeiwen.com/subject/nemifhtx.html