袋子里最少数目的球【LC1760】
You are given an integer array
numswhere theithbag containsnums[i]balls. You are also given an integermaxOperations.You can perform the following operation at most
maxOperationstimes:
- Take any bag of balls and divide it into two new bags with a positive number of balls.
- For example, a bag of
5balls can become two new bags of1and4balls, or two new bags of2and3balls.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
-
思路:
- 首先,将题意转化为,当操作次数一定时,求出单个袋子里球的数目的最大值的最小值yyy,那么可以通过二分查找的方法找到最终的yyy,二分查找的下限为1,上限为数组
nums中的最大值 - 当二分查找yyy时,对于第iii个袋子,它装有nums[i]nums[i]nums[i]个球,那么我们需要使其分割的新袋子内球的个数小于等于yyy,所需要的操作数为⌊nums[i]−1y⌋\lfloor \frac{nums[i]-1}{y} \rfloor⌊ynums[i]−1⌋
- 当nums[i]≤ynums[i] \le ynums[i]≤y时,不需要进行操作
- 当y<nums[i]≤yy\lt nums[i] \le yy<nums[i]≤y时,需要1次操作
- 当y<nums[i]≤2yy\lt nums[i] \le 2yy<nums[i]≤2y时,需要2次操作
- 那么总操作次数为$ P =\sum_{i=0}^{n-1}\lfloor \frac{nums[i]-1}{y} \rfloor,当,当,当P \le maxOperations$时,调整二分查找的上界,否则调整二分查找的下界
- 首先,将题意转化为,当操作次数一定时,求出单个袋子里球的数目的最大值的最小值yyy,那么可以通过二分查找的方法找到最终的yyy,二分查找的下限为1,上限为数组
-
实现
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)O(nlogC)O(nlogC),nnn是数组的长度,C是数组中的最大值
- 空间复杂度:O(1)O(1)O(1)
- 复杂度

该博客讨论了一道编程题目,涉及在限制操作次数的情况下如何将含有不同数量球的袋子重新分配,以最小化单个袋子的最大球数。通过二分查找算法,寻找在不超过最大操作次数时能实现的最小最大球数。博客内容涵盖了问题的转化、操作计数方法以及二分查找的实施细节,旨在帮助读者理解并解决此类问题。

被折叠的 条评论
为什么被折叠?



