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;
}
}