题目名称

给你一个整数数组 nums 和一个整数 k ,按以下方法修改该数组:

选择某个下标 i 并将 nums[i] 替换为 -nums[i] 。
重复这个过程恰好 k 次。可以多次选择同一个下标 i 。

以这种方式修改数组后,返回数组 可能的最大和

示例

输入:nums = [4,2,3], k = 1
输出:5
解释:选择下标 1 ,nums 变为 [4,-2,3] 。

题解

先针对数组进行排序
然后从最小值开始进行翻转,当 k > 0 且 第i位 小于0 的时候翻转,并且记录一下翻转后的数组的最小值
最后如果 k % 2 = 0, 直接返回数组的和
如果k % 2 = 1 返回数组的和减去 二倍的最小值

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @param {number[]} nums
* @param {number} k
* @return {number}
*/
var largestSumAfterKNegations = function(nums, k) {
let min = Infinity;
nums = nums.sort((a, b) => a - b)
for(let i = 0; i < nums.length; i++) {
if(k > 0 && nums[i] < 0 ) {
nums[i] = -nums[i]
k--
}
if(k > 0) {
min = Math.min(min, nums[i])
}
}
let total = nums.reduce((total, item) => total += item, 0)
if(k % 2 === 0) return total
return total - min * 2
};