日渐头秃的代码日记 -- 13 LC第288周赛第三题

154 阅读1分钟

K 次增加后的最大乘积

给你一个非负整数数组 nums 和一个整数 k 。每次操作,你可以选择 nums 中 任一 元素并将它 增加 1 。

请你返回 至多 k 次操作后,能得到的 **nums的 最大乘积 。由于答案可能很大,请你将答案对 109 + 7 取余后返回。

 

示例 1:

输入: nums = [0,4], k = 5
输出: 20
解释: 将第一个数增加 5 次。
得到 nums = [5, 4] ,乘积为 5 * 4 = 20 。
可以证明 20 是能得到的最大乘积,所以我们返回 20 。
存在其他增加 nums 的方法,也能得到最大乘积。

示例 2:

输入: nums = [6,3,3,2], k = 2
输出: 216
解释: 将第二个数增加 1 次,将第四个数增加 1 次。
得到 nums = [6, 4, 3, 3] ,乘积为 6 * 4 * 3 * 3 = 216 。
可以证明 216 是能得到的最大乘积,所以我们返回 216 。
存在其他增加 nums 的方法,也能得到最大乘积。

 

提示:

  • 1 <= nums.length, k <= 105
  • 0 <= nums[i] <= 106

解题思路: 两个方法,第一个方法比较简单,将nums进行排序,循环k次,每次都把nums里最小的数字加1放回,这样就可以得到最后要计算乘积的数组。 第二个方法思路是,nums和k,加完之后,数字总和是固定的,总和一定的前提下,数字间方差越小,总乘积越大。

from queue import PriorityQueue
class Solution:
    mod = 1000000007
    def maximumProduct(self, nums: List[int], k: int) -> int:
        if nums.count(0) > k:
            return 0
        for i in range(len(nums)):
            if nums[i] == 0:
                nums[i] = 1
                k -= 1
        # 0全变成1
        q = PriorityQueue()
        for n in nums:
            q.put(n)
        for i in range(k):
            x = q.get()
            x += 1
            q.put(x)
        p = 1
        while not q.empty():
            p = p % self.mod
            n = q.get()
            p *= n
        return p % self.mod

这里需要注意,每一次计算乘法之后,都对结果取一次模,这样可以不超时,不然数字太大,计算会超时。