給你一個非負整數數組 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 的方法,也能得到最大乘積。
class Solution {
public:int maximumProduct(vector<int>& nums, int k) {int MOD = 1e9 + 7;priority_queue<int, vector<int>, greater<int>> q(nums.begin(), nums.end());for(int i = 0; i < k; i++){int a = q.top();q.pop();a++;q.push(a);}int ans = 1;while(!q.empty()){ans = (long long)ans * q.top() % MOD;q.pop();}return ans;}
};
這道題我們要找進行k次操作后的最大乘積是多少,那么我們結合貪心的思路,我們可以知道在和一樣的情況下,所有的元素越平均,最后乘積會越大。
那么也就是說我們每次進行+1操作,要對最小的元素操作,我們就可以使用小根堆來找出每一輪最小的元素,然后進行操作。
然后我們用一個變量ans記錄乘積的值,將q的所有元素進行相乘記錄到ans中,最后返回ans即可。