2022-10-21【我的刷题日记】1005k次取反后的最大数组

思路:本题能够很好的体现贪心的算法思想,我们需要对数组中的值进行k次取反,得到总和最大的数组,那么我们首先就应该进行最大负数的取反,紧接着对剩余的负数按照绝对值的大小进行取反,这样就可以得到负数部分取反求和的最大值,同样也是整体部分的最大值,同样对于整数部分,如果此时k还大于0则需要继续取反,我们只需要找到目前为正的最小的值,不断取反直到k为0即可,所以为了能够达成这样按照次序的取反遍历,我们需要一开始就按绝对值大小对数组进行排序

class Solution {
    public int largestSumAfterKNegations(int[] nums, int k) {
//        按绝对值从大到小排序
        nums = IntStream.of(nums)
                .boxed()
                .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1))
                .mapToInt(Integer::intValue).toArray();
        for (int i = 0; i < nums.length;i++) {
//            在有k剩余的情况 尽可能多的把负数取反为正数
            if (nums[i] < 0 && k>0){
                nums[i] = -nums[i];
                k--;

            }
        }
        //            此时已经没有负数了 找到最小的数 不断进行转换知道k为0即可
//            实际上只需要进行一次取反即可 因为偶数k取反两次等于本身
        if (k % 2 == 1) nums[nums.length - 1] = -nums[nums.length - 1];

        return Arrays.stream(nums).sum();

    }
}

你可能感兴趣的:(2022-10-21【我的刷题日记】1005k次取反后的最大数组)