二分搜索(1)-爱吃香蕉的珂珂

83 阅读1分钟

题目

爱吃香蕉的珂珂

解题思路

要求返回在 h 小时内吃掉所有香蕉的最小速度 kk 为整数),转化一下等同于求右区间的左边界。

一般二分搜索都需要一个有序数列,此题没有有序数列,那怎么办呢?
观察可知,如果有一个函数f(k)f(k)来表示当吃香蕉速度为kk时,吃完所有香蕉所用的时间,那么f(k)f(k)是随着kk单调递减的。
再更近一步,为什么我们需要序列是有序的呢?
其实是为了缩小每次搜索区间。

代码实现

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