K次取反后最大化的数组和
Question
给你一个整数数组 nums
和一个整数k
,按以下方法修改该数组:
选择某个下标 i
并将 nums[i]
替换为 -nums[i]
。 重复这个过程恰好 k
次。可以多次选择同一个下标i
。
以这种方式修改数组后,返回数组 可能的最大和 。
思路
需要考虑很多种情况,设数组中复数的个数为 n
- k<n,尽量把绝对值大的负数变为正数
- k>n,将所有的负数变为正数后重新排序,选最小的那个数变为负数
- k=n,将所有的负数变为正数直接求和
js
var largestSumAfterKNegations = function(nums, k) {
nums.sort((a,b)=>a<b?-1:1) //排序
for(let i in nums){
if(nums[i]<0 && k>0){ //数组中存在负数,将所有的负数变为正数
k--
nums[i] = -1*nums[i]
}
}
k = k%2 //k只有三种情况:k=0、k为奇数、k为偶数,其中k=0和k为偶数结果相同
if(k===1){ //重新排序
nums.sort((a,b)=>a<b?-1:1)
nums[0] = -1*nums[0]
}
return nums.reduce((pre,cur)=>pre+cur,0)
};