# min speed

```java
class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        int low = 1;
        int high = getMaxPile(piles);
        int ans = high;

        while (low <= high) {
            int mid = low + (high - low) / 2;

            if (canEatAll(piles, h, mid)) {
                ans = mid;
                high = mid - 1;
            } else {
                low = mid + 1;
            }
        }
        return ans;
    }

    private boolean canEatAll(int[] piles, int h, int k) {
        long totalHours = 0;
        for (int bananas : piles) {
            totalHours += (int)Math.ceil((double)bananas / k);
            if (totalHours > h) return false;
        }
        return true;
    }

    private int getMaxPile(int[] piles) {
        int max = 0;
        for (int p : piles) {
            if (p > max) max = p;
        }
        return max;
    }
}
```
