LeetCode 875. 爱吃香蕉的珂珂

题目描述

875. 爱吃香蕉的珂珂

思路分析

解法一:二分答案(推荐)

核心思路

  • 吃香蕉速度 k 越大,用时越少,具有单调性。
  • 二分搜索最小速度,使得总耗时不超过 h
  • ceil(pile / k) 计算每堆所需时间。


复杂度分析

  • 时间复杂度:O(n log M),其中 n 表示堆数,M 表示最大堆大小。
  • 空间复杂度:O(1),仅使用常数额外空间。
class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        int left = 1;
        int right = 0;
        for (int pile : piles) {
            right = Math.max(right, pile);
        }

        while (left < right) {
            int mid = left + (right - left) / 2;

            if (canFinish(piles, h, mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }

        return left;
    }

    private boolean canFinish(int[] piles, int h, int speed) {
        long hours = 0;
        for (int pile : piles) {
            // 计算每堆所需时间
            hours += (pile + speed - 1) / speed;
        }
        return hours <= h;
    }
}
func minEatingSpeed(piles []int, h int) int {
    left, right := 1, 0
    for _, p := range piles {
        if p > right {
            right = p
        }
    }

    for left < right {
        mid := left + (right-left)/2
        if canFinish(piles, h, mid) {
            right = mid
        } else {
            left = mid + 1
        }
    }

    return left
}

func canFinish(piles []int, h int, speed int) bool {
    hours := 0
    for _, p := range piles {
        // 计算每堆所需时间
        hours += (p + speed - 1) / speed
    }
    return hours <= h
}

相似题目

题目 难度 考察点
1011. 在 D 天内送达包裹的能力 中等 二分答案
1482. 制作 m 束花所需的最少天数 中等 二分答案
774. 最小化去加油站的最大距离 困难 二分答案
410. 分割数组的最大值 困难 二分答案
1283. 使结果不超过阈值的最小除数 中等 二分答案
本文作者:
本文链接: https://hgnulb.github.io/blog/2026/67822546
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处!