题目
爱吃香蕉的珂珂
解题思路
要求返回在 h
小时内吃掉所有香蕉的最小速度 k
(k
为整数),转化一下等同于求右区间的左边界。
一般二分搜索都需要一个有序数列,此题没有有序数列,那怎么办呢?
观察可知,如果有一个函数来表示当吃香蕉速度为时,吃完所有香蕉所用的时间,那么是随着单调递减的。
再更近一步,为什么我们需要序列是有序的呢?
其实是为了缩小每次搜索区间。
代码实现
class Solution:
def minEatingSpeed(self, piles: List[int], h: int) -> int:
def _can_finish(x):
cnt = 0
for p in piles:
cnt += p // x
if p % x:
cnt += 1
return cnt <= h
left = 1
right = max(piles)
while left <= right:
mid = left + (right - left) // 2
if _can_finish(mid):
right = mid - 1
else:
left = mid + 1
return left