

这个问题可以用 二分查找 来解决。我们需要找到最小的吃香蕉速度 k 使得珂珂可以在 h 小时内吃完所有香蕉。
解题思路
-
确定搜索范围:
- 最小的吃香蕉速度是 1(每小时至少吃 1 根)。
- 最大的吃香蕉速度是
(一次性吃完最多的香蕉堆)。
-
二分查找最小的 k:
- 计算以 k 速度吃完所有香蕉所需的时间:
- 如果所需时间 小于等于 h,说明 k 可能还能更小,尝试降低速度。
- 否则,说明 k 太小,吃不完,需要增加 k。
- 计算以 k 速度吃完所有香蕉所需的时间:
-
返回最小的 k。
代码实现
import math
def minEatingSpeed(piles, h):
left, right = 1, max(piles) # 速度的搜索范围
while left < right:
mid = (left + right) // 2
hours = sum(math.ceil(pile / mid) for pile in piles) # 计算吃完香蕉需要的时间
if hours <= h:
right = mid # 继续尝试更小的吃香蕉速度
else:
left = mid + 1 # 吃不完,需要更快的速度
return left # 返回最小的满足条件的 k
复杂度分析
- 二分查找的次数:
,其中 M 是最大香蕉数。
- 计算时间 O(n)(每次二分查找需要遍历所有香蕉堆)。
- 总时间复杂度:
。
示例
piles = [3, 6, 7, 11]
h = 8
print(minEatingSpeed(piles, h)) # 输出 4
解释
| 速度 k | 总耗时 |
|---|---|
| 4 | 3 + 2 + 2 + 3 = 8 |
| 5 | 3 + 2 + 2 + 3 = 8 |
| 6 | 3 + 1 + 2 + 2 = 8 |
| 7 | 1 + 1 + 1 + 2 = 5 |
最小的 k 是 4,满足在 8 小时内 吃完所有香蕉。
这个方法保证了最优解,并且在大数据量时仍然高效!🚀
622

被折叠的 条评论
为什么被折叠?



