Leetcode 1005.K次取反后最大化的数组和

题目描述

在这里插入图片描述

思路

首先阅读题干,发现可以对同一个数多次取反,这一点很重要。

所以解题思路很明朗,首先对数组进行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;
    }
};

Guess you like

Origin blog.csdn.net/weixin_45847364/article/details/121766397