文章目录
- 题目[](https://leetcode.cn/problems/maximize-sum-of-array-after-k-negations/)
- 算法原理
- 源码
- 总结
题目
如上图,k是取反的次数,在数组【4,-1,3】中,当k = 1,把-2取反为2,和为9;在数组【3,-1,0,2】中,当k = 3,-1取反为1,再把2取反m-k=2次,还是2,和为6.
算法原理
分情况讨论:
设:整个数组中负数的个数是m 个
(1)m>k;把前k小负数,转化为正数(如下图)
(2)m==k,把所有的负数转化成正数(如下图)
(3)m<k;先把所有的负数变成正数;在根据k-m的奇偶性,偶数情况;直接忽略;奇数情况:挑选当前数组中最小的数,变成负数(如下图)。
源码
class Solution {
public:int largestSumAfterKNegations(vector<int>& nums, int k) {int m =0,minElem = INT_MAX, n =nums.size();for(auto x :nums){if(x < 0) m++;minElem = min(minElem,abs(x));//求绝对值最小的那个数}//分类讨论int ret = 0;if(m > k){sort(nums.begin(),nums.end());for(int i = 0;i<k;i++){ret+= -nums[i];}for(int i = k;i<n;i++){ret+= nums[i];}}else{//把所有的负数变成正数for(auto x :nums) ret+=abs(x);if((k-m) % 2){ret-=minElem*2;}}return ret;}
};
总结
以上就是1005 K 次取反后最大化的数组和(贪心),喜欢博主写的内容可以一键三连支持博主。