875. 爱吃香蕉的珂珂
搜索左侧边界的二分查找
/*
时间复杂度分析:getHours需要扫描整个数组,每执行一次需要O(n)的时间。函数getHours执行的次数等于minEatingSpeed中while循环执行的次数。由于应用了二分查找算法,while循环执行的次数为O(logMAX),max为最多一堆香蕉的数目。因此总的时间复杂度是O(nlogMAX)。
*/
class Solution {
public int minEatingSpeed(int[] piles, int H) {
int max = Integer.MIN_VALUE;
for(int pile : piles) {
max = Math.max(max, pile);
}
int left = 1;
int right = max;
while(left <= right) {
int mid = left + (right - left) / 2;
int hours = getHours(piles, mid);
if(hours <= H) {
if(mid == left || getHours(piles, mid - 1) > H) {
return mid;
}
right = mid - 1;
} else {
left = mid + 1;
}
}
return -1;
}
// 辅助函数getHours的作用是计算Koko以某一速度speed吃完所有香蕉piles需要的时间。
private int getHours(int[] piles, int speed) {
int hours = 0;
for(int pile : piles) {
// (pile + speed - 1) / speed 表示pile除以speed向上取整
hours += (pile + speed - 1) / speed;
}
return hours;
}
}