题目
给你一个非负整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/maximum-product-after-k-increments
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
解题思路
这题操作的数字,应该是调整数组最小的那个值。我们要找出数组最小的那个值,然后加一。最后相乘。
解法一:遍历求最小值
超时了
public static int maximumProduct(int[] nums, int k) {
if(nums.length==0)
{
return 0;
}
for (int i = 0; i < k; i++) {
int min = nums[0];
int minIndex=0;
for (int j = 0; j < nums.length; j++) {
if(nums[j]<min)
{
minIndex=j;
min=nums[j];
}
}
nums[minIndex]++;
}
int res = 1;
for (int num: nums) {
res =(int)((long) num * (long)res % 1000000007);
}
return res;
}
解法二:优先队列求最小值
public static int maximumProduct2(int[] nums, int k) {
if(nums.length==0)
{
return 0;
}
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>();
for (int num :nums
) {
priorityQueue.offer(num);
}
for (int i = 0; i < k; i++) {
int n = priorityQueue.poll();
n++;
priorityQueue.offer(n);
}
int res = 1;
while (!priorityQueue.isEmpty()){
int num = priorityQueue.poll();
res =(int)((long) num * (long)res % 1000000007);
}
return res;
}
- 用优先队列取最大值
int[] nums = {1, 2, 3, 4, 5, 6};
Comparator<Integer> comparator =new Comparator<Integer>() {
@Override
public int compare(Integer o1, Integer o2) {
return o2-o1;
}
};
PriorityQueue<Integer> priorityQueue = new PriorityQueue<>(comparator);
for (int num :nums
) {
priorityQueue.offer(num);
}
System.out.println(priorityQueue.poll());
标签:216,乘积,nums,int,priorityQueue,num,增加,最大
From: https://www.cnblogs.com/huacha/p/16876038.html