思路
贪心+分情况模拟
简单来说,就是要想反转后和最大,那肯定优先去反转负数,但如果反转完负数K的次数还有,那就分情况
- k为奇数,重复反转最小的值【题目允许】
- k为偶数,无需操作还是原来的结果。
PS:这里按绝对值从大到小排序,而不是直接从小到大排序,是为了避免负数反转后比原正数还大,从而导致最后还要重新排序。
优化
复习
复习下arr.reduce
的用法。
var largestSumAfterKNegations = function(nums, k) {
nums.sort((a,b)=>{
return Math.abs(b) -Math.abs(a); //绝对值从大到小排序
})
for(let i =0;i<nums.length;i++){
if(nums[i]<0&&k>0){
nums[i] *=-1;
k--;
}
}
if(k>0&&k%2===1){
//负数全转正后仍有奇数个k
nums[nums.length-1] *= -1; //反转最小正数
}
return nums.reduce((a,b)=>{
return a+b;
})
};