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。

🏷️

标签

➡️

继续阅读