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 <= 1050 <= 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
这里需要注意,每一次计算乘法之后,都对结果取一次模,这样可以不超时,不然数字太大,计算会超时。