10005.K次取反后的最大数组和
一开始自己写了个思路简单但代码量大的解法,特此记录一下:
class Solution {
public int largestSumAfterKNegations(int[] nums, int k) {
int nav_num = 0;
int sum = 0;
boolean hasZero = false;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
nav_num++;
} else if (nums[i] == 0) {
hasZero = true;
}
sum += nums[i];
}
int[] nav = new int[nav_num];
int index = 0;
for (int i = 0; i < nums.length; i++) {
if (nums[i] < 0) {
nav[index++] = nums[i];
}
}
Arrays.sort(nav);
if (k < nav_num) {
int count = 0;
while (count < k) {
sum -= 2 * nav[count];
count++;
}
return sum;
} else if (k == nav_num) {
for (int i = 0; i < nav_num; i++) {
sum -= 2*nav[i];
}
return sum;
} else {
int extraFlips = k - nav_num;
if (extraFlips % 2 == 0 || hasZero) {
for (int i = 0; i < nav_num; i++) {
sum -= 2*nav[i];
}
return sum;
} else {
int minAbs = Integer.MAX_VALUE;
if(nav_num >0)
minAbs = Math.abs(nav[0]);
for (int num : nums) {
minAbs = Math.min(minAbs, Math.abs(num));
}
for (int i = 0; i < nav_num; i++) {
sum -= 2*nav[i];
}
return sum - 2 * minAbs;
}
}
}
}
很繁琐,还借助了gpt