875 愛吃香蕉的珂珂(二分查詢)

2021-10-10 02:57:18 字數 1323 閱讀 7216

1. 問題描述

示例 1:

輸入: piles = [3,6,7,11], h = 8

輸出: 4

示例 2:

輸入: piles = [30,11,23,4,20], h = 5

輸出: 30

示例 3:

輸入: piles = [30,11,23,4,20], h = 6

輸出: 23

2. 思路分析:

① 分析題目可以知道我們一開始的時候需要確定每次吃掉香蕉的速度k,然後檢查在h小時之內是否可以吃完即可,這裡涉及到乙個最小與最大的範圍,最小的範圍比較好確定為1,每一次吃的速度都為k所以在len(piles)小時就可以吃完而且piles.length <= h所以最大的範圍為10 ^ 9,所以我們可以在這樣乙個範圍內尋找最終的答案,當發現吃的速度為中間值的時候假如可以在h小時內吃完那麼說明吃的速度可能會更小,這樣時候縮小右邊界即可,假如不能夠吃完那麼需要擴大左邊界

② 檢查是否可以在k個小時內吃完也很簡單,我們只需要遍歷piles陣列中的元素然後除以k,累加所有元素的吃的時間即可,這裡有乙個小技巧就是我們可以先減去1然後再除以k,這樣可以避免if判斷吃不完香蕉的情況,最後返回吃的時間是否小於等於h即可判斷是否可以在h小時內吃完

③ 感覺比較重要的是看出是二分查詢的模型,看出之後剩下來的就比較好辦了

3. **如下:

from typing import list

class solution:

# 檢查是否能夠在h小時內完成即可

def check(self, piles: list[int], h: int, k: int):

sum = 0

for i in range(len(piles)):

sum += (piles[i] - 1) // k + 1

return sum <= h

def mineatingspeed(self, piles: list[int], h: int) -> int:

l, r = 1, 10 ** 9

res = r

while l <= r:

mid = (l + r) // 2

if self.check(piles, h, mid):

res = mid

r = mid - 1

else:

l = mid + 1

return res

875 愛吃香蕉的珂珂 medium

珂珂喜歡吃香蕉。這裡有 n 堆香蕉,第 i 堆中有 piles i 根香蕉。警衛已經離開了,將在 h 小時後回來。珂珂可以決定她吃香蕉的速度 k 單位 根 小時 每個小時,她將會選擇一堆香蕉,從中吃掉 k 根。如果這堆香蕉少於 k 根,她將吃掉這堆的所有香蕉,然後這一小時內不會再吃更多的香蕉。珂珂喜...

leetcode 875 愛吃香蕉的珂珂

875.愛吃香蕉的珂珂 珂珂喜歡吃香蕉。這裡有 n 堆香蕉,第 i 堆中有 piles i 根香蕉。警衛已經離開了,將在 h 小時後回來。珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。返回她可以在 h 小時內吃掉所有香蕉的最小速度 k k 為整數 示例 1 輸入 piles 3,6,7,11 ...

Leetcode 875 愛吃香蕉的珂珂

珂珂喜歡吃香蕉。這裡有n堆香蕉,第i堆中有piles i 根香蕉。警衛已經離開了,將在h小時後回來。珂珂可以決定她吃香蕉的速度k 單位 根 小時 每個小時,她將會選擇一堆香蕉,從中吃掉k根。如果這堆香蕉少於k根,她將吃掉這堆的所有香蕉,然後這一小時內不會再吃更多的香蕉。珂珂喜歡慢慢吃,但仍然想在警衛...