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

来源:力扣(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());
posted @ 2022-11-10 09:35  花茶冰糖  阅读(43)  评论(0编辑  收藏  举报