【二分查找】LeetCode - 875. 爱吃香蕉的珂珂

题目描述

题目链接
【二分查找】LeetCode - 875. 爱吃香蕉的珂珂_第1张图片

解法

  • 如果珂珂能以 K 的进食速度最终吃完所有的香蕉(在 H 小时内),那么她也可以用更快的速度吃完。
  • 当珂珂能以 K 的进食速度吃完香蕉时,我们令 possible(K) 为 true。举个例子,当初始条件为 piles = [3, 6, 7, 11] 和 H = 8 时,存在 X = 4 使得 possible(1) = possible(2) = possible(3) = False,且 possible(4) = possible(5) = … = True。
  • 我们可以二分查找 possible(K) 的值来找到第一个使得 possible(X) 为 True 的 X,初试设 low = 1, high = 数组最大值
  • 对于每一堆(大小 p > 0),我们可以推断出珂珂将在 Math.ceil(p / K) = (p -1) / K + 1 小时内吃完这一堆,我们将每一堆的完成时间加在一起并与 H 进行比较。
class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int H) {
        int max=0;
        for(int i : piles)//找数组最大值
         max = max > i ? max : i;
        int low = 1,high = max;
        while(low < high)
        {
            int mid = (low + high) / 2;
            if(!Ispossible(piles, H, mid))
             low = mid + 1;
            else
             high = mid;
        }
        return low;
    }
    bool Ispossible(vector<int>& piles, int H, int k)
    {
        int time = 0;
        for(int i : piles)
         time += (i-1)/k + 1;
        return time <= H;
    }
};

二分查找 所说的 “二分” 不一定是两个指向数组头尾的指针,还可以是本题的 possible 的最大最小值;循环判断的条件也不一定是让 nums[mid] 和某一给定值比,还可以是跟一个计数值比,比如 【二分查找】LeetCode - 287. 寻找重复数

你可能感兴趣的:(二分查找,leetcode)