1760. 袋子里最少数目的球

算法记录

LeetCode 题目:

  给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。



说明

一、题目

  你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。

二、分析

  • 题目的意思就是在限定的拆分下得到整个数组中的最大值, 而这个最大值要尽可能的小.
  • 拆分之后的值是一个正整数, 也就意味着这个最优值肯定在 1 - max 之间, 只需要从小到大遍历这个区间值, 然后针对每个值进行拆分, 并且最终的操作数都满足限定条件, 这样不就可以拿到最优的拆分了.
  • 这里也可以采用二分来快速的迭代错误的答案.
class Solution {
    public int minimumSize(int[] nums, int target) {
        int l = 1, r = -1, mid;
        for(int i : nums) r = Math.max(r, i);
        while(l <= r) {
            mid = (l + r) >> 1;
            if(check(nums, mid) <= target) r = mid - 1;
            else l = mid + 1;
        }
        return l;
    }

    public int check(int[] nums, int target) {
        int ret = 0;
        for(int i : nums) {
            ret += i / target - 1;
            ret += i % target == 0 ? 0 : 1;
        }
        return ret;
    }
}

总结

熟悉二分的遍历方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值