题目描述
解法
- 如果珂珂能以 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. 寻找重复数