Koko Eating Bananas — Binary Search on Answer (Speed)

Sanjeev SharmaSanjeev Sharma
1 min read

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

Sanjeev Sharma

Written by

Sanjeev Sharma

Full Stack Engineer · E-mopro