LC875- 爱吃香蕉的珂珂
2022-06-07 11:01:04 333 字 · 约 1 分钟 # algorithm

「link」

img


初看此题,还是没有什么思路,也是第一次见这种类型(二分答案)。

从正面考虑吃完所有香蕉的最小速度并不好求,但若我们已知一个速度,我们就可以知道能否在小时内吃完这些香蕉。

因为每堆香蕉的耗时就为,因此总耗时也可以求得为。

因此我们就可以对进行二分,在以为分割点的数组上具有「二段性」。

小于的值,总耗时必然不满足;

大于等于的值,总耗时必然满足。

然后就是需要确定二分的范围,因为每堆香蕉最少需要耗费一个小时,因为二分的上边界即为最大香蕉数,接下来就是对速度进行二分。

JAVA
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
文章链接: https://www.codenote.xyz/posts/ab96fbb4.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 CZQ的codenote!