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