offer2-73


狒狒喜欢吃香蕉。这里有 n 堆香蕉,第 i 堆中有 piles[i] 根香蕉。警卫已经离开了,将在 h 小时后回来。

狒狒可以决定她吃香蕉的速度 k (单位:根/小时)。每个小时,她将会选择一堆香蕉,从中吃掉 k 根。如果这堆香蕉少于 k 根,她将吃掉这堆的所有香蕉,然后这一小时内不会再吃更多的香蕉,下一个小时才会开始吃另一堆的香蕉。

狒狒喜欢慢慢吃,但仍然想在警卫回来前吃掉所有的香蕉。

返回她可以在 h 小时内吃掉所有香蕉的最小速度 kk 为整数)。

示例 1:

输入:piles = [3,6,7,11], h = 8
输出:4

示例 2:

输入:piles = [30,11,23,4,20], h = 5
输出:30

示例 3:

输入:piles = [30,11,23,4,20], h = 6
输出:23

提示:

  • 1 <= piles.length <= 104
  • piles.length <= h <= 109
  • 1 <= piles[i] <= 109

//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        int start = 1;

        int end = 0;

        for (int pile : piles) {
            if (pile > end) {
                end = pile;
            }
        }

        while (start <= end) {
            if (start == end) {
                return start;
            }

            if (start + 1 == end) {
                int startH = needH(piles, start);

                if (startH <= h) {
                    return start;
                } else {
                    return end;
                }
            }

            int mid = start + (end - start) / 2;
            int midH = needH(piles, mid);

            if (midH <= h) {
                end = mid;
            } else {
                start = mid;
            }

        }

        return -1;
    }


    private int needH(int[] piles, int speed) {
        int result = 0;

        for (int pile : piles) {
            result += (pile / speed);
            if (pile % speed > 0) {
                result++;
            }
        }

        return result;
    }
}
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !