爱吃香蕉的珂珂
珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。
珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。
示例:
输入: piles = [3,6,7,11], H = 8
输出: 4
思路
解法一:
该题与1011. 在 D 天内送达包裹的能力 类似,一样的思路
- 找出速度的区间,最小值为1,因为piles.length <= H,所以速度最大值为数组的最大值;
- 使用二分法寻找速度的最佳取值
import math
class Solution:
def minEatingSpeed(self, piles: List[int], h: int) -> int:
left, right = 1, max(piles)
while left < right:
mid = left + (right - left) // 2
if self.check(piles, mid, h): # 满足条件,向速度小的值靠拢
right = mid
else: # 不满足条件,向速度大的值靠拢
left = mid + 1
return right
def check(self, piles, mid, h): # 检查速度为mid时,能否在h小时内吃完
n = len(piles)
i = 0
total = 0
while i < n:
total += math.ceil(piles[i] / mid)
i += 1
return total <= h