原题链接:
1005. K 次取反后最大化的数组和
https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/description/
完成情况:
解题思路:
/* 变化思路:
优先选择负数进行变正
如果还不够则考虑选择绝对值最小的正数,来回变化,抵消剩余次数。
*/
// TODO 可以考虑使用Arrays.sort() 找出可以变成负数的值,同时看看数量是否有多;有多,则Math.abs()交替
// 如果前k个数全部小于0,直接反转,如果k有剩余,则反转最小值
参考代码:
_1005K次取反后最大化的数组和
package 代码随想录.贪心算法;
import java.util.Arrays;
public class _1005K次取反后最大化的数组和 {
/**
*
* @param nums
* @param k k为固定需要变化K次
* @return
*/
public int largestSumAfterKNegations(int[] nums, int k) {
/* 变化思路:
优先选择负数进行变正
如果还不够则考虑选择绝对值最小的正数,来回变化,抵消剩余次数。
*/
// TODO 可以考虑使用Arrays.sort() 找出可以变成负数的值,同时看看数量是否有多;有多,则Math.abs()交替
// 如果前k个数全部小于0,直接反转,如果k有剩余,则反转最小值
Arrays.sort(nums);
int minValue = Integer.MAX_VALUE;
for (int i = 0; i <nums.length; i++){
if (k==0){
break;
}
if (nums[i] < 0){
nums[i] = -nums[i];
k--;
}
if (minValue > nums[i]){
//如果当前绝对值比minValue小
minValue = nums[i];
}
}
int result = 0;
if (k%2==0){
for (int num:nums){
result+=num;
}
}else {
for (int num:nums){
result+=num;
}
result-=(2*minValue);
}
return result;
}
}
_1005K次取反后最大化的数组和_简洁写法
package 代码随想录.贪心算法;
import java.util.Arrays;
public class _1005K次取反后最大化的数组和_简洁写法 {
/**
*
* @param nums
* @param k
* @return
*/
public int largestSumAfterKNegations(int[] nums, int k) {
Arrays.sort(nums);
for (int num : nums) {
if (k>0 && num < 0){
num = -num;
k--;
}
}
Arrays.sort(nums);
return Arrays.stream(nums).sum() - (k%2 == 0 ? 0 : nums[0] * 2);
}
}
错误经验吸取
如图所示:
增强for循环(foreach循环)遍历数组
在第二个示例中,使用增强for循环(foreach循环)遍历数组时,你不能直接修改数组中的元素。增强for循环是只读的,无法通过这种方式修改数组元素的值。因此,对
num
的修改不会影响到原始数组。
如果你想修改数组元素的值,建议使用普通的for循环,就像你在第一个示例中所做的那样。
如果你希望在增强for循环中修改数组元素的值,可以使用数组索引,类似于以下方式:
for (int i = 0; i < nums.length; i++) {
int num = nums[i];
if (k > 0 && num < 0) {
nums[i] = -1 * num;
k--;
}
}
这样就能在增强for循环中修改原始数组的元素值。