LC875- 爱吃香蕉的珂珂

初看此题,还是没有什么思路,也是第一次见这种类型(二分答案)。
从正面考虑吃完所有香蕉的最小速度并不好求,但若我们已知一个速度,我们就可以知道能否在小时内吃完这些香蕉。
因为每堆香蕉的耗时就为,因此总耗时也可以求得为。
因此我们就可以对进行二分,在以为分割点的数组上具有「二段性」。
小于的值,总耗时必然不满足;
大于等于的值,总耗时必然满足。
然后就是需要确定二分的范围,因为每堆香蕉最少需要耗费一个小时,因为二分的上边界即为最大香蕉数,接下来就是对速度进行二分。
class Solution {
public int minEatingSpeed(int[] piles, int h) {
int r = Integer.MIN_VALUE;
for (int pile : piles) {
r = Math.max(r, pile);
}
int l = 1;
while (l < r) {
int mid = l + r >> 1;
if (check(mid, piles, h)) {
r = mid;
} else {
l = mid + 1;
}
}
return r;
}
private boolean check(int mid, int[] piles, int h) {
int tot = 0;
for (int pile : piles) {
tot += Math.ceil(pile * 1.0 / mid);
}
return tot <= h;
}
}
时间复杂度,空间复杂度。
CZQ
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CZQ的codenote!
