// 定义一个名为Solution的类
class Solution {
// 定义一个public方法largestSumAfterKNegations,输入参数为一个整数数组nums和一个整数K,返回值类型为整数
public int largestSumAfterKNegations(int[] nums, int K) {
// 使用Java流对数组中的元素进行操作,先转换为Integer对象流,然后根据绝对值大小进行降序排序
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 < len; i++) {
// 如果当前元素是负数并且还有剩余的变换次数K
if (nums[i] < 0 && K > 0) {
// 将当前负数变为正数,并减少剩余的变换次数K
nums[i] = -nums[i];
K--;
}
}
// 如果变换次数K仍有剩余,并且是奇数(即还需要变换一次),则将数组中当前绝对值最小的元素(即最后一个元素)变号
if (K % 2 == 1) {
nums[len - 1] = -nums[len - 1];
}
// 计算经过K次变换后数组中所有元素之和,并返回该最大和
return Arrays.stream(nums).sum();
}
}
此方法的作用是在给定整数数组nums中进行最多K次操作,每次操作可以选择一个负数变为它的相反数(正数)。目标是使数组元素和尽可能大。首先按绝对值大小对数组进行降序排列,然后优先将负数变为正数,最后若变换次数K为奇数,则将当前绝对值最小的元素变号。最后返回处理后数组的元素总和。