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

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

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

相关推荐
代码山河25 分钟前
基本类型转换:自动类型转换与强制类型转换
java·学习·架构·教程·面向对象·项目
Escalating_xu2 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
程序猿乐锅2 小时前
万字详解Single-flight(单飞模式)
java·开发语言·分布式·后端·学习·single-flight
AiNightVision2 小时前
无人机夜视模块如何选择?——从参数指标到系统集成的完整选型指南
人工智能·算法·计算机视觉·车载系统·无人机·视频·智能硬件
Java后端的Ai之路2 小时前
【AIAgent开发】-Agent工具封装成CLI(纯干货!!!)
java·javascript·人工智能·agent·cli
AntsData3 小时前
用 12K+ 条亚马逊评论信号,定位机械键盘下一版该改什么
java·大数据·计算机外设
code2cat3 小时前
【随笔】连续批处理:长短请求怎样在迭代之间补位
java·人工智能·后端·大语言模型·vllm
最强小杰3 小时前
DeepSeek V4 Flash + Codex CLI 接入教程:原生 Responses API 适配,从配置到跑通收藏这篇就够了(2026)
java·前端·python·ai
牧羊人.3333 小时前
卷积神经网络之VGG
人工智能·深度学习·神经网络·算法·cnn
Flynn Liang3 小时前
Spring AI 2.0 深度解析:ChatClient、Advisor 链与 MCP——Java 工程师的 AI 落地最优解
java·人工智能·spring·大模型·架构设计·spring ai