【Leetcode】1760. 袋子里最少数目的球——1940
📝 题目
1760. 袋子里最少数目的球
给你一个整数数组 nums ,其中 nums[i] 表示第 i 个袋子里球的数目。同时给你一个整数 maxOperations 。
你可以进行如下操作至多 maxOperations 次:
- 选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。- 比方说,一个袋子里有
5个球,你可以把它们分到两个新袋子里,分别有1个和4个球,或者分别有2个和3个球。
你的开销是单个袋子里球数目的 最大值 ,你想要 最小化 开销。
请你返回进行上述操作后的最小开销。
提示:
1 <= nums.length <= 1051 <= maxOperations, nums[i] <= 109
🔍 思路
关键词检索,最大值的最小化GET,二分法秒了
对于单个袋子里球数目最大值n,当期减小的时候,此时需要更多次数的操作,即开销更多。
因此n与开销是完全单调的关系。
此时考虑使用二分法,所要二分的对象是单个袋子里球数目最大值n,根据给定的n我们可以计算出所需要的操作次数是否超过给定次数。
对于给定n,对于袋子i而言,每次分割出一个n,所需要保证其分割的结果是每个都不超过n所需要的次数是(nums[i]-1)//n
✍️ 代码实现
class Solution:
def minimumSize(self, nums: List[int], maxOperations: int) -> int:
n = len(nums)
def check(i):
return sum((x + i - 1) // i for x in nums) - n <= maxOperations
return bisect_right(range(1, max(nums)), False, key=check)+1

浙公网安备 33010602011771号