给被k的网站做友链,小程序代理方法,考研培训机构排名前十,提升学历图片素材1005 . K 次取反后最大化的数组和
给你一个整数数组 nums 和一个整数 k #xff0c;按以下方法修改该数组#xff1a; 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后#xff0c;返回数组 可能…1005 . K 次取反后最大化的数组和
给你一个整数数组 nums 和一个整数 k 按以下方法修改该数组 选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。 重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后返回数组 可能的最大和 。
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(); 这行代码让我们一步一步解释它的作用 IntStream.of(nums)将原始的 int 数组转换为 IntStream这是Java 8中的一个流。这是为了使我们能够在流上进行后续操作。 .boxed()将 IntStream 中的每个元素装箱为 Integer 对象。这是因为后续的排序操作需要使用比较器而比较器需要处理对象。 .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) 计算的是两个元素绝对值的差值这用于指示排序顺序。 .mapToInt(Integer::intValue)将排序后的 Integer 对象流转换回 IntStream。 .toArray()将排序后的 IntStream 转换回 int 数组。
这行代码的最终作用是将原始的 int 数组按绝对值从大到小排序后以 int 数组的形式返回。这个排序后的数组将在后续的处理中被使用。