875. 爱吃香蕉的珂珂(2022-6-7)
珂珂喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。
珂珂可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 h 小时内吃掉所有香蕉的最小速度 k(k 为整数)。
示例 1:
输入:piles = [3,6,7,11], h = 8
输出:4
示例 2:
输入:piles = [30,11,23,4,20], h = 5
输出:30
示例 3:
输入:piles = [30,11,23,4,20], h = 6
输出:23
提示:
- 1 <= piles.length <= 10^4
- piles.length <= h <= 10^9
- 1 <= piles[i] <= 10^9
解题思路
按照惯例,我们先来分解题意,因为这个场景有点别扭:
「一个小时吃k
个,吃不吃的完都只能在『当前堆』待完全吃完才能去下一堆,最后求出不超过h
的最小k
」
容易想到:
-
如果时间和堆数一致,
k
就只能取最大值了; -
如果时间比较富裕,我们就可以去从
[0,max]
中去找较小值,此时可以排序后一个个遍历,或者慢慢「减一遍历」 -
但其实查找的方式还是「二分查找」更加合适,可以更快的逼近目标数。
提醒一点⚠️warning::消耗的总时间小于或者等于
h
时,我们的动作都是将「右端点」进行左移,也就是缩小右边界。
var minEatingSpeed = function(piles, h) {
// 辅助函数:求当前速度需要消耗的时间
const getH = (arr, speed) => {
return arr.reduce((pre,cur) => pre + Math.ceil(cur / speed), 0)
}
let l = 1, r = Math.max(...piles), total = 0
while( l < r ) {
let mid = (l + r) >> 1
total = getH(piles,mid)
if( total > h ){
l = mid + 1
}else {
r = mid
}
}
return l
};
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/koko-eating-bananas
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。