【每日一题Day62】LC1760袋子里最少数目的球 | 二分查找

简介: 首先,将题意转化为,当操作次数一定时,求出单个袋子里球的数目的最大值的最小值y yy,那么可以通过二分查找的方法找到最终的y yy,二分查找的下限为1,上限为数组nums中的最大值

袋子里最少数目的球【LC1760】


You are given an integer array nums where the ith bag contains nums[i] balls. You are also given an integer maxOperations.


You can perform the following operation at most maxOperations times:


  • Take any bag of balls and divide it into two new bags with a positive number of balls.


。For example, a bag of 5 balls can become two new bags of 1 and 4 balls, or two new bags of 2 and 3 balls.


Your penalty is the maximum number of balls in a bag. You want to minimize your penalty after the operations.


Return the minimum possible penalty after performing the operations.


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


你可以进行如下操作至多 maxOperations 次:


  • 选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有正整数个球。


。比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。


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


请你返回进行上述操作后的最小开销。


题是永远刷不完的… 尽量把做过的都搞懂吧

2022/12/20


  • 思路:


。首先,将题意转化为,当操作次数一定时,求出单个袋子里球的数目的最大值的最小值y,那么可以通过二分查找的方法找到最终的y ,二分查找的下限为1,上限为数组nums中的最大值


。当二分查找y y时,对于第i 个袋子,它装有nums[i]个球,那么我们需要使其分割的新袋子内球的个数小于等于y,所需要的操作数为image.png


  • 当nums[i]≤y时,不需要进行操作
  • 当y < n u m s [ i ] ≤ y 时,需要1次操作
  • 当y < n u m s [ i ] ≤ 2 y,需要2次操作


。那么总操作次数为$ P =\sum_{i=0}^{n-1}\lfloor \frac{nums[i]-1}{y} \rfloor,当 P \le maxOperations$时,调整二分查找的上界,否则调整二分查找的下界


  • 实现


class Solution {
    public int minimumSize(int[] nums, int maxOperations) {
        int l = 1, r = Arrays.stream(nums).max().getAsInt();
        int res = 0;
        while (l <= r){
            int mid = (r + l) / 2;
            int ops = 0;
            for (int num : nums){
                ops += (num - 1) / mid;
            }
            if (ops <= maxOperations){
                res = mid;
                r = mid - 1;
            }else{
                l = mid + 1;
            }
        }
        return res;
    }
}


。复杂度


  • 时间复杂度:O(nlogC),n 是数组的长度,C是数组中的最大值
  • 空间复杂度:O ( 1 )


目录
相关文章
|
6月前
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
【每日一题Day312】LC2240买钢笔和铅笔的方案数 | 完全背包 数学
57 0
|
6月前
|
存储
【每日一题Day275】LC771宝石与石头 | 哈希表 状态压缩
【每日一题Day275】LC771宝石与石头 | 哈希表 状态压缩
43 0
|
6月前
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
【每日一题Day302】LC849到最近的人的最大距离 | 贪心+分类讨论
53 0
|
6月前
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
【每日一题Day114】LC1223 掷骰子模拟 | 记忆化搜索+dp
53 0
|
6月前
【每日一题Day297】LC1444切披萨的方案数 | 动态规划+二维前缀和
【每日一题Day297】LC1444切披萨的方案数 | 动态规划+二维前缀和
64 0
|
6月前
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
【每日一题Day149】LC2389和有限的最长子序列 | 贪心+前缀和+二分查找
43 0
|
6月前
|
vr&ar
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
【每日一题Day166】LC1053交换一次的先前排列 | 贪心
71 1
|
6月前
|
存储 算法
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
【每日一题Day310】LC1654到家的最少跳跃次数 | BFS
45 0
|
6月前
【每日一题Day314】LC1921消灭怪物的最大数量 | 贪心+排序
【每日一题Day314】LC1921消灭怪物的最大数量 | 贪心+排序
45 0
|
6月前
|
计算机视觉
【每日一题Day231】LC1240铺瓷砖 | 暴力回溯
【每日一题Day231】LC1240铺瓷砖 | 暴力回溯
51 0