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 }

 

参考

Yipsen

posted @ 2021-12-23 23:02  DidUStudy  阅读(26)  评论(0编辑  收藏  举报