1005. K 次取反后最大化的数组和
描述
给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:
选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。
以这种方式修改数组后,返回数组 可能的最大和 。
链接
1005. K 次取反后最大化的数组和 - 力扣(LeetCode) (leetcode-cn.com)
解法:贪心
1 class Solution { 2 public int largestSumAfterKNegations(int[] nums, int k) { 3 // 排序,把可能有的负数排到前面 4 Arrays.sort(nums); 5 int sum = 0; 6 for (int i = 0; i < nums.length; i++) { 7 // 贪心:如果是负数,而k还有盈余,就把负数反过来 8 if (nums[i] < 0 && k > 0) { 9 nums[i] = -1 * nums[i]; 10 k--; 11 } 12 sum += nums[i]; 13 } 14 Arrays.sort(nums); 15 // 如果k没剩,那说明能转的负数都转正了,已经是最大和,返回sum 16 // 如果k有剩,说明负数已经全部转正,所以如果k还剩偶数个就自己抵消掉,不用删减,如果k还剩奇数个就减掉2倍最小正数。 17 return sum - (k % 2 == 0 ? 0 : 2 * nums[0]); 18 } 19 }
参考