一、题目
二、思路
- 速度 k(单位:根/小时)是存在一个取值范围的。
- 速度越大肯定在规定的时间之内一定会吃完全部的香蕉,但也是可以确定出一个上界的。由于只要保证一小时之内,可以吃完香蕉数目最多的那一堆的香蕉,那么其他数目更小的香蕉在1小时之内肯定都是可以吃完的,那么 k 的最大值就是数组的最大值。
- k 肯定不为 0,又是整数,确定其最小值为 1.
- k ∈ [1, max_pile]
- 采用二分查找进行寻找 k 的最小值。
三、代码
java
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int n = piles.length;
// 确定 k 的搜索范围
int l = 1, r = 0;
for (int pile : piles) {// 找到香蕉数量最多的为 k 的最大值
r = Math.max(r, pile);
}
// 范围内进行二分查找
while (l <= r) {
int mid = l + (r - l)/2;
if (check(piles, h, mid)) {// 检查当前速度 k 是否能够在规定时间 h 内将全部香蕉吃完
r = mid - 1;// 能吃完说明当前 k 较大,收缩右边界
} else {
l = mid + 1;// 不能吃完说明当前 k 较小,收缩左边界
}
}
return l;
}
public boolean check(int[] piles, int h, int mid) {
int sum = piles.length;
for (int pile : piles) {
sum += (pile - 1) / mid;
if (sum > h) {
return false;
}
}
return true;
}
}