1005. K 次取反后最大化的数组和
- 原题链接:
- 完成情况:
- 解题思路:
- 参考代码:
- _1005K次取反后最大化的数组和
- _1005K次取反后最大化的数组和_简洁写法
- 错误经验吸取
- 增强for循环(foreach循环)遍历数组
原题链接:
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循环中修改原始数组的元素值。