视频讲解:https://www.bilibili.com/video/BV138411G7LY/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/1005.K次取反后最大化的数组和.html#算法公开课
力扣题目:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/
这道题的思路其实很简单:
- 将数组按绝对值从大到小排
- 先紧着绝对值大的负数进行取反,并且消耗k
- 如果负数全部取反但是k没有被消耗完,判断k是否是偶数,如果是,无事发生
- 如果剩余k不是偶数,选择绝对值最小的数进行取反,也就是nums[nums.size() - 1]
- 最后计算result
需要注意的是,sort函数支持自定义排序:
cpp
class Solution {
static bool cmp(int a, int b) {
return abs(a) > abs(b);
}
sort(nums.begin(), nums.end(), cmp);
cmp是自定义的排序函数。
cpp
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++)
{
//优先将nums中的负数反转,因为已经sort过了,for循环都是先挑绝对值大的负数反转
if(nums[i] < 0 && k > 0)
{
nums[i] = nums[i] * (-1);
k--;
}
}
//反转负数后如果k还有剩余,分奇偶,偶数无事发生,奇数挑个绝对值最小的反转
if(k % 2 == 1)
{
//找出绝对值最小值
nums[nums.size() - 1] *= -1;
}
int result = 0;
for(int i : nums)
{
result = result + i;
}
return result;
}
};