875. 爱吃香蕉的珂珂

https://leetcode.cn/problems/koko-eating-bananas/

假设每小时吃 max(piles) 根香蕉,那么按照题意(向上取整)来说就只要 piles.length 个小时就可以吃完。而注意提示中的:piles.length <= h <= 10^9,这说明每小时吃 max(piles) 根香蕉已经是最大的速度了,再快也没用了。因此需要去找比 max(piles) 小的且满足题意的数。

那取 max(piles) 作为右边界,左边界取 1 (因为总不可能不吃吧~),然去通过二分去找最小的满足条件的速度。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution {
public:
    int minEatingSpeed(vector<int>& piles, int h) {
        int left = 1, right = *ranges::max_element(piles);
        auto check = [&](int x) {
            long long sum{};
            for (int p : piles) {
                sum += (p + x - 1) / x;
            }
            return sum <= h;
        };
        while (left <= right) {
            int mid = (left + right) >> 1;
            if (check(mid)) {
                right = mid - 1;
            } else {
                left = mid + 1;
            }
        }
        return left;
    }
};

相似题目:

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计