875. 爱吃香蕉的珂珂(Medium)
题目描述
总共有 $N$ 堆香蕉,每次珂珂只能吃一堆,找到珂珂在 $H$ 小时内吃掉香蕉的最小速度。
注:如果这堆香蕉少于 $K$ 根,她将吃掉这 堆的所有香蕉,然后这一小时内不会再吃更多的香蕉。
样例
Input: piles = [3,6,7,11], H = 8
Output: 4
题解
二分查找:明确一点,本题寻找的是靠右的值
Python示例
# 模板1
import math
class Solution:
def minEatingSpeed(self, piles: List[int], H: int) -> int:
def get_hours(k):
hours = 0
for pile in piles:
hours += math.ceil(pile / k)
return hours
# 更简洁的写法
# def get_hours(k):
# return sum(( p - 1) // k + 1 for p in piles)
left, right = 1, max(piles)
ans = 0
while left <= right:
mid = math.ceil((left + right) / 2) # 向右取整
if get_hours(mid) <= H: # 吃的快,慢一点找到最小的速度
ans = mid
right = mid - 1
else:
left = mid + 1
return ans
# 模板2 左闭右开,找到的值是靠右的
import math
class Solution:
def minEatingSpeed(self, piles: List[int], H: int) -> int:
def get_hours(k):
hours = 0
for pile in piles:
hours += math.ceil(pile / k)
return hours
left, right = 1, max(piles) + 1
ans = 0
while left < right:
mid = (left + right) >> 1
if get_hours(mid) <= H: # 吃的快,慢一点找到最小的速度
right = mid
else:
left = mid + 1
return left