【代码随想录day 28】 力扣 1005. K次取反后最大化的数组和
视频讲解:https://www.bilibili.com/video/BV138411G7LY/?vd_source=a935eaede74a204ec74fd041b917810c
文档讲解:https://programmercarl.com/1005.K%E6%AC%A1%E5%8F%96%E5%8F%8D%E5%90%8E%E6%9C%80%E5%A4%A7%E5%8C%96%E7%9A%84%E6%95%B0%E7%BB%84%E5%92%8C.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
力扣题目:https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/
这道题的思路其实很简单:
- 将数组按绝对值从大到小排
- 先紧着绝对值大的负数进行取反,并且消耗k
- 如果负数全部取反但是k没有被消耗完,判断k是否是偶数,如果是,无事发生
- 如果剩余k不是偶数,选择绝对值最小的数进行取反,也就是nums[nums.size() - 1]
- 最后计算result
需要注意的是,sort函数支持自定义排序:
class Solution {static bool cmp(int a, int b) {return abs(a) > abs(b);
}sort(nums.begin(), nums.end(), cmp);
cmp是自定义的排序函数。
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;}
};