题目描述
思路
首先阅读题干,发现可以对同一个数多次取反,这一点很重要。
所以解题思路很明朗,首先对数组进行sort
升序排序,使得数组左侧为最小值,右侧为最大值。
然后从左到右依次对数组取反,这时就涉及到一个K值了。
如果K小于等于数组中负数的个数,则从左到右依次反转并求和即可,直到K为0.
如果K大于数组中负数的个数,则依然从左到右依次取反,知道nums[i]>=0
,此时数组中全为非负数,这时判断剩余K的奇偶性。如果剩余的K为偶数,则不用再进行取反了,直接累加和就好;如果剩余的K为奇数,则对数组中绝对值最小的数进行取反,即目的是使得减去的值最少。
完整代码实现如下:
代码实现
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k)
{
sort(nums.begin(),nums.end()); //将数组按照升序排列
int sum=0;
int abs_min=100;
for(int i=0;i<nums.size();i++)
{
abs_min=min(abs(nums[i]),abs_min);
sum+=nums[i];
}
for(int i=0;i<nums.size()&&k;i++,k--)
{
if(nums[i]>=0)
{
break;
}
sum+=2*abs(nums[i]);
}
if(k>0&&(k%2==1))
{
sum-=2*abs_min;
}
return sum;
}
};