题目
解题思路
主要思路:
- 首先将数组进行排序,从小到大排序。分情况讨论。
- 首先再k值大小的范围内将所有的负数进行翻转,按照绝对值大小的顺序(排序的时候,绝对值大的负数已经排在了前面,所以按照默认情况反转就好),如果k值在这个过程中耗尽,那么直接返回加和之后的结果。
- 如果k在反转完所有的负数后还有剩余,再进行判断:
- k = 偶数,不影响结果,直接返回加和结果即可。
- k = 奇数,相当于偶数 + 1,先将当前数组再进行一次排序,选择第一个元素进行反转(可能是0,有可能是正数,不过此时的正数一定是最小的),然后将加和的结果进行返回。
代码
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
// 将原数组进行排序,方便反转使用。
// 从小到大排列
Arrays.sort(nums);
int sum = 0;
// 在k的范围内对所有的负数进行一次反转。反转后将k值-1
for (int i = 0; i < nums.length; i++) {
// 当k值不为0,将所有的负数进行一次反转
if(nums[i] < 0 && k > 0) {
// 对负数进行一次反转
nums[i] = nums[i] * (-1);
k--;
}
}
// 当k值为0(无法再进行反转)或者负数全部反转后还有k值剩余
// 当剩余的k为偶数,不影响结果,直接返回所有值的和即可。
if (k == 0 || k % 2 == 0) {
for (int i : nums) {
sum += i;
}
return sum;
} else {
// 当k为奇数时,将数组重新排序。
// 只将第一个元素(要么是0,要么是最小的正数,
// 因为全部的负数都被反转了)进行反转
Arrays.sort(nums);
nums[0] = nums[0] * (-1);
for (int i : nums) {
sum += i;
}
}
return sum;
}
}