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;
    }
}

总结

熟悉二分的遍历方法。

Guess you like

Origin blog.csdn.net/MTYSYS19990212/article/details/121215371