Leetcode之二分法專題-875. 愛吃香蕉的珂珂(Koko Eating Bananas)
珂珂喜歡吃香蕉。這里有 N
堆香蕉,第 i
堆中有 piles[i]
根香蕉。警衛已經離開了,將在 H
小時后回來。
珂珂可以決定她吃香蕉的速度 K
(單位:根/小時)。每個小時,她將會選擇一堆香蕉,從中吃掉 K
根。如果這堆香蕉少於 K
根,她將吃掉這堆的所有香蕉,然后這一小時內不會再吃更多的香蕉。
珂珂喜歡慢慢吃,但仍然想在警衛回來前吃掉所有的香蕉。
返回她可以在 H
小時內吃掉所有香蕉的最小速度 K
(K
為整數)。
示例 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
提示:
1 <= piles.length <= 10^4
piles.length <= H <= 10^9
1 <= piles[i] <= 10^9
分析:
求一個K,使得每小時最多吃K個,在H小時內可以吃完。
如果每小時吃K個可以在H小時內吃完,那么吃大於K個,也一定可以在H小時內吃完。
寫出二分規則:
每小時吃K個可以吃完,這個K可能是答案也可能比答案大,所以需要保留這個K,並向左區間尋找,R = mid
每小時吃K個不能吃完,這個K肯定不是答案,舍棄,需要找更大的K,向右區間尋找,L = mid + 1
AC代碼:
class Solution { public int minEatingSpeed(int[] piles, int H) { int L = 1; int R = Integer.MAX_VALUE; while(L<R){ int mid = (L+R)>>>1; if(ok(piles,mid,H)){ R = mid; }else{ L = mid+1; } } return L; } public boolean ok(int[] piles, int mid, int h) { int days = 0; for (int i = 0; i < piles.length; i++) { if(piles[i]<=mid){ days++; }else days+=(piles[i]/mid)+1; } if(days<=h) return true; else return false; } }