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

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

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

选择某个下标 i 并将 numsi 替换为 -numsi

重复这个过程恰好 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 数组的形式返回。这个排序后的数组将在后续的处理中被使用。

相关推荐
信誓旦旦的程序猿几秒前
【零依赖量化数据实战 #25】北交所技术指标与基本面
java·人工智能·python·股票数据api·股票数据·股票数据api接口·股票api数据接口
华华哥20224 分钟前
《模型不玄学》第25章 双头模型:共享底座 + 两个分支
算法
万年咸鱼5 分钟前
Java ArrayList 详解:原理、用法与实战
java·开发语言·windows
Yfhonier14 分钟前
6441. 特别的除法
c++·算法
华华哥202218 分钟前
《模型不玄学》第5章 看懂你的数据:先认字段,再过门禁
算法
国科安芯21 分钟前
低轨卫星姿轨控系统中抗辐射MCU的选型依据与工程实践
单片机·嵌入式硬件·算法·架构·系统安全·低轨卫星·抗辐射
高亦真27 分钟前
今天是学习嵌入式的第33天
linux·学习·算法
CoderYanger28 分钟前
A.每日一题:3345. 最小可整除数位乘积 I
java·数据结构·程序人生·算法·leetcode·面试·学习方法
带多刺的玫瑰29 分钟前
Leecode#16刷题之最接近的三数之和
数据结构·算法
小刘是地理大王32 分钟前
OpenFeign 兜底回调(fallback / fallbackFactory)实战指南
java·后端