Skip to content
Blogster on GitHub Dinesh on Twitter

875.爱吃香蕉的珂珂

链接

思路

对问题进行解析,找到最小符合的k,那么怎么样才是符合的k呢?就是遍历piles数组将它除以k,向上取整。如果累加的和是小于等于h那么就是合法的。

当我们的k从小到大进行变化的话,那么整体的累加的和就会单调递减,有了单调性就可以使用二分查找了,这里我们使用二分答案。

check函数计算piles[i] / h向上取整的和。

  1. 当计算出来的和是小于等于h的话,说明mid的值是大,说明是在右区间的,将r = mid
  2. 当计算出来的和是大于h,那么将l = mid + 1

技巧,在处理向上取整可以使用a / b ==> a + b - 1 / b就可以达到向上取整了

代码

class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        
        int l = 1;
        int r = (int)1e9;

        while (l < r) {
            int mid = (l + r) >> 1;
            // 如果计算的值是小于等于h说明mid可能是比较大的
            if (check(piles, mid) <= h) r = mid;
            else l = mid + 1;
        }
        return l;
    }

    public static int check(int[] p, int mid) {
        int res = 0;
        for (int i : p) {
            // 技巧向上取整 x + mid - 1 / mid
            res += (i + mid - 1) / mid;
        }
        return res;
    }
}