【Leetcode】1760. 袋子里最少数目的球——1940

📝 题目

1760. 袋子里最少数目的球

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

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

  • 选择任意一个袋子,并将袋子里的球分到 2 个新的袋子中,每个袋子里都有 正整数 个球。- 比方说,一个袋子里有 5 个球,你可以把它们分到两个新袋子里,分别有 1 个和 4 个球,或者分别有 2 个和 3 个球。

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

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

提示:

  • 1 <= nums.length &lt;= 105
  • 1 &lt;= maxOperations, nums[i] &lt;= 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
posted @ 2024-12-13 22:18  TICSMC  阅读(23)  评论(0)    收藏  举报