力扣1005题(K次取反后最大化的数组和)

1005.K次取反后最大化的数组和

基本思想:

贪心算法

具体实现:

局部最优:让绝对值大的负数变为正数

整体最优:整个数组和达到最大

局部最优:让绝对值小的正数变为负数

整体最优:整个数组和达到最大

1.将数组按照绝对值大小从大到小排序

2.遍历数组,遇到负数将其变为正数,同时k--

3.k还大于0的话,让反复转变数值小的元素,将k用完

4.求和

代码:

class Solution {
    public int largestSumAfterKNegations(int[] nums, int K) {
        int sum = 0;
        int n = nums.length;
        Integer[] sortNums = new Integer[n];
        for(int i = 0; i < n; i++) 
            sortNums[i] = nums[i];//new Integer(nums[i]);自动装箱
        Arrays.sort(sortNums, (a,b)->{//逆序排序
                return Math.abs(b) - Math.abs(a);
            });
        for (int i = 0; i < n; i++) {
            if (sortNums[i] < 0 && K > 0) {
                sortNums[i] *= -1;
                K--;
            }
        }
        if (K != 0) {//这时sortNums数组中都是正数,如果剩下的k是奇数,让最后一个数变负数
            sortNums[n - 1] = (K % 2 == 1) ? (-sortNums[n - 1]) : sortNums[n - 1];
        }
        for (int i = 0; i < n; i++) {
                sum += sortNums[i];
        }  
        return sum;    
    }

 

posted @ 2021-10-22 21:39  最近饭吃的很多  阅读(23)  评论(0编辑  收藏  举报