Koko Eating Bananas — Binary Search on Answer (Speed)
Advertisement
Problem 314 · Koko Eating Bananas
Difficulty: Medium · Pattern: BS on Answer
Minimize k (bananas/hour) such that Koko can eat all piles in h hours.
Intuition
Answer is in [1, max(piles)]. For a given speed k, hours = sum(ceil(pile/k)). Binary search to find minimum feasible k.
Solutions
# Python
import math
def minEatingSpeed(piles, h):
lo, hi = 1, max(piles)
while lo < hi:
mid = (lo+hi)//2
hours = sum(math.ceil(p/mid) for p in piles)
if hours <= h: hi = mid # feasible, try smaller
else: lo = mid+1 # too slow
return lo
// Java
public int minEatingSpeed(int[] piles, int h) {
int lo=1, hi=0;
for (int p:piles) hi=Math.max(hi,p);
while (lo<hi) {
int mid=lo+(hi-lo)/2;
long hours=0; for (int p:piles) hours+=(p+mid-1)/mid;
if (hours<=h) hi=mid; else lo=mid+1;
}
return lo;
}
// C++
int minEatingSpeed(vector<int>& piles, int h) {
int lo=1, hi=*max_element(piles.begin(),piles.end());
while (lo<hi) {
int mid=lo+(hi-lo)/2; long hours=0;
for (int p:piles) hours+=(p+mid-1)/mid;
if (hours<=h) hi=mid; else lo=mid+1;
}
return lo;
}
Complexity
- Time: O(n log m) where m = max pile
- Space: O(1)
Advertisement