题目(leecode T1005):
给你一个整数数组 nums
和一个整数 k
,按以下方法修改该数组:
- 选择某个下标
i
并将nums[i]
替换为-nums[i]
。
重复这个过程恰好 k
次。可以多次选择同一个下标 i
。
以这种方式修改数组后,返回数组 可能的最大和 。
方法:本题的思路其实比较好想,要想使得整体数组的和最大,一定是数组里的正数元素越多越好,因此我们要把所有k的机会优先用来将负数修改为正数,这里的修改顺序也是有讲究的,不能是随便选,我们k是有限的,想使得整体的总和最大要优先把绝对值大的数先修改为正数,这里就是局部贪心的一个思想。如果k为0了那就直接结束,此时就是最大的值了。但是如果所有数修改为正数之后,k还是大于0的,我们就需要对正数修改为负数了,这里还有贪心思想,我们要选择绝对值最小的数来修改,这样可以使得总和最大,同时因为我们可以对一个数重复操作,因此我们只选择一个的绝对值最小的数即可,判断此时k的奇偶性,如果是偶数就不用管了,最后还是正数;但如果是负数我们需要进行一次修改。最后求和即可。
题解:
class Solution {
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
sort(nums.begin(), nums.end(), cmp); //按绝对值从大到小排序
for(int i = 0; i < nums.size(); i++){
if(nums[i] < 0 && k > 0){ //找出负数并且k>0
nums[i] *= -1;
k--;
}
}
if(k % 2 == 1){ //判断k的奇偶
nums[nums.size() - 1] *= -1;
}
int result = 0;
for(int a : nums){ //结束求和
result += a;
}
return result;
}
};