K 次取反后最大化的数组和【贪心算法】

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

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。

重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和 。

java 复制代码
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();

        int len = nums.length;

        for (int i = 0; i < nums.length; i++) {
            if (nums[i] < 0 && k > 0) {//对其中的绝对值较大的负数进行反转,变为正数
                nums[i] = - nums[i];
                k--;
            }
        }
        if (k % 2 == 1) {//如果K仍有剩余,取绝对值最小的一个元素进行反复取反;另外注意:k为偶数两次取反抵消,无需操作,k为奇数,相当于取反依次
            nums[len - 1] = - nums[len - 1];
        }
        return Arrays.stream(nums).sum();
    }
} 

关于 nums = IntStream.of(nums).boxed().sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)).mapToInt(Integer::intValue).toArray(); 这行代码,让我们一步一步解释它的作用:

  1. IntStream.of(nums):将原始的 int 数组转换为 IntStream,这是Java 8中的一个流。这是为了使我们能够在流上进行后续操作。

  2. .boxed():将 IntStream 中的每个元素装箱为 Integer 对象。这是因为后续的排序操作需要使用比较器,而比较器需要处理对象。

  3. .sorted((o1, o2) -> Math.abs(o2) - Math.abs(o1)):对流中的元素进行排序。这里使用了一个比较器,该比较器会按照元素的绝对值从大到小进行排序。

    • (o1, o2) -> Math.abs(o2) - Math.abs(o1) 是一个Lambda表达式,它描述了如何比较两个元素 o1o2
    • Math.abs(o2) - Math.abs(o1) 计算的是两个元素绝对值的差值,这用于指示排序顺序。
  4. .mapToInt(Integer::intValue):将排序后的 Integer 对象流转换回 IntStream

  5. .toArray():将排序后的 IntStream 转换回 int 数组。

这行代码的最终作用是:将原始的 int 数组按绝对值从大到小排序后,以 int 数组的形式返回。这个排序后的数组将在后续的处理中被使用。

相关推荐
程序无bug11 分钟前
Java 服务性能优化,提升QPS
java·后端
阑梦清川16 分钟前
使用C语言原生的字符串函数求解的一道题目总结
算法
阑梦清川16 分钟前
算法竞赛小白晋级之路---高精度减法(题目+解析+代码)
算法
2401_8812444021 分钟前
牛客周赛 Round 100
算法
Java技术小馆25 分钟前
5种禁止用户复制的实用方案
java·面试·架构
duration~1 小时前
Spring AI快速入门
java·人工智能·后端·spring·flask
没有羊的王K1 小时前
SSM框架学习——day3
java·spring boot·学习
月堂1 小时前
【无标题】
java·linux·windows
GG不是gg1 小时前
详解SPFA算法-单源最短路径求解
算法·图论
remCoding1 小时前
Java大厂面试实录:从Spring Boot到AI大模型的深度技术拷问
java·spring boot·redis·spring cloud·ai·kafka·microservices