875爱吃香蕉的珂珂

题目:珂珂喜欢吃香蕉。这里有 N 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 H 小时后回来。珂珂可以决定她吃香蕉的速度 K (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 K 根。如果这堆香蕉少于 K 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。  珂珂喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。
返回她可以在 H 小时内吃掉所有香蕉的最小速度 K(K 为整数)。
链接:https://leetcode-cn.com/problems/koko-eating-bananas

法一:自己的代码

思路:对速度进行分割,与其它二分的区别是这里的是个函数,把速度传入返回时间进行比较,

from typing import List
import math
class Solution:
    def minEatingSpeed(self, piles: List[int], H: int) -> int:
        s = sum(piles)
        # 最小速度是left,最大速度是right
        left = s // H
        if left == 0:
            return 1
        right = max(piles)
        # 计算速度x时,所用的时间
        def judge(x):
            # h是时间
            h = 0
            for i in piles:
                # 这里向上取整
                h += math.ceil(i / x)
            return h
        while left <= right:
            mid = (left + right) >> 1
            # 如果时间短,说明速度大,缩小右边界
            if judge(mid) <= H:
                right = mid - 1
            # 否则速度小,增大左边界
            else:
                left = mid + 1
        return left
if __name__ == '__main__':
    solution = Solution()
    # result = solution.minEatingSpeed(piles = [3,6,7,11], H = 8)
    # result = solution.minEatingSpeed(piles = [8,8,8,8], H = 8)
    result = solution.minEatingSpeed(piles = [4], H = 8)
    print(result)
View Code

体会代码与69题,只是left和right的位置互换了,和返回的边界不同

ttt

猜你喜欢

转载自www.cnblogs.com/xxswkl/p/12381077.html