LeetCode——875.爱吃香蕉的珂珂

本文介绍了一种解决编程问题的方法,通过双指针技巧和二分查找,找到使数组元素按商向上取整后总和最小的k值。思路类似于分配巧克力,目标是找到让每个人都能整除且剩余最少的速度。作者分享了Java代码实现和效率优化建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

通过万岁!!!

  • 题目:就是给你一个数组,然后让你找到一个数k,使得数组中每个数/k向上取整的值之和最小。
  • 思路:这里我的思路跟之前的双指针分巧克力是一样的,我们找到理论上的最小值,然后找到最大值,然后二分查找找到满足条件的最小的值即可。每次都去调用一个函数,判断当前的k(也就是代码中的mid),是不是满足全部吃完,如果满足,则说明k太大了,则右指针到mid,吃不完,则k太小了,则左指针右移。
  • 技巧:双指针进行二分查找。

java代码

class Solution {
    public int minEatingSpeed(int[] piles, int h) {
        int len = piles.length;
        int max = -1;
        for (int i = 0; i < len; i++) {
            max = Math.max(max, piles[i]);
        }
        if (h == len) {
            return max;
        }
        // k最小的值应该是数组中最大的值/h,这时候我们只考虑最大的。如果还有其他的,那么速度一定还需要再快,所以这是k的最小值。
        int l = max / h, r = max, mid;
        while (l <= r) {
            mid = l + (r - l) / 2;
            int t = isEatAll(piles, h, mid);
            if (t == -1) {
                r = mid - 1;
            } else {
                l = mid + 1;
            }
        }
        return l;
    }


    public int isEatAll(int[] piles, int h, int k) {
        int t = 0;
        for (int i = 0; i < piles.length; i++) {
            if (piles[i] <= k) {
                ++t;
            } else {
                t += Math.ceil(piles[i] * 1.0 / k);
            }
        }
        if (t <= h) {// 吃得完
            return -1;
        } else {// 吃不完
            return 1;
        }
    }
}
  • 总结:题目不是很难,但是我的效率并不高。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值