Leetcode: 最小吃香蕉速度
原文英文,约500词,阅读约需2分钟。
📝
内容提要
文章讨论了Leetcode上的问题:Koko吃香蕉。Koko有n堆香蕉,需在h小时内吃完。目标是找到最小的吃香蕉速度k,使得Koko能在规定时间内吃完所有香蕉。通过二分查找法调整k的范围,计算所需时间,最终实现了最小速度k的Python代码。
🔎
延伸解读
二分查找的适用性
本题要求最小的整数速度k,使得总时间不超过h。总时间随k增大而单调不增,因此满足二分查找的条件。文章将搜索范围设为1到最大堆的香蕉数,因为速度不可能超过最大堆,否则会浪费。这种单调性是二分查找有效的前提。
时间计算中的向上取整
对于每堆香蕉,以速度k吃需要ceil(pile/k)小时,因为不足一小时也按一小时计。文章使用math.ceil实现。总时间curr_h是各堆时间之和。若curr_h>h,说明速度太慢,需增大k;否则可能可以更小,需减小k。
边界处理与返回值
二分查找中,当curr_h<=h时,将high设为k-1,继续寻找更小速度;当curr_h>h时,将low设为k+1。循环结束时low即为最小可行速度。文章代码返回low,正确。注意初始low=1,因为速度至少为1。
❓
Q&A
Koko吃香蕉的问题是什么?
Koko需要在h小时内吃完n堆香蕉,目标是找到最小的吃香蕉速度k。
如何确定Koko的最小吃香蕉速度k?
通过二分查找法调整k的范围,计算在当前速度下所需的时间,找到满足条件的最小k。
Koko每小时可以吃多少个香蕉?
Koko可以选择每小时吃k个香蕉,如果某堆香蕉少于k个,她会吃完该堆的所有香蕉。
在什么情况下需要增加Koko的吃香蕉速度k?
如果在当前速度k下所需的时间curr_h大于h,就需要增加k。
给定的示例输入是什么?
示例输入为piles = [3, 6, 7, 11],h = 8。
如何用Python实现这个问题的解决方案?
可以使用二分查找法,计算每个速度下的时间,直到找到最小的k。
🏷️