LeetCode 1005. K 次取反后最大化的数组和(C++)

给定一个整数数组 A,我们只能用以下方法修改该数组:我们选择某个个索引 i 并将 A[i] 替换为 -A[i],然后总共重复这个过程 K 次。(我们可以多次选择同一个索引 i。)

以这种方式修改数组后,返回数组可能的最大和。

示例 1:

输入:A = [4,2,3], K = 1
输出:5
解释:选择索引 (1,) ,然后 A 变为 [4,-2,3]。

示例 2:

输入:A = [3,-1,0,2], K = 3
输出:6
解释:选择索引 (1, 2, 2) ,然后 A 变为 [3,1,0,2]。

示例 3:

输入:A = [2,-3,-1,5,-4], K = 2
输出:13
解释:选择索引 (1, 4) ,然后 A 变为 [2,3,-1,5,4]。

提示:

1 <= A.length <= 10000

1 <= K <= 10000

-100 <= A[i] <= 100

C++

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& A, int K) 
    {
        int n=A.size();
        int pos=0;
        int neg=0;
        int zero=0;
        int min_pos=101;
        int max_neg=-101;
        for(int i=0;i<n;i++)
        {
            if(A[i]>0)
            {
                pos++;
                min_pos=min(A[i],min_pos);
            }
            else if(A[i]<0)
            {
                neg++;
                max_neg=max(A[i],max_neg);
            }
            else
            {
                zero++;
            }
        }
        sort(A.begin(),A.end());
        if(zero)
        {
            if(K>=neg)
            {
                int res=0;
                for(int i=0;i<n;i++)
                {
                    if(A[i]<0)
                    {
                        res+=-A[i];
                    }
                    else
                    {
                        res+=A[i];
                    }
                }
                return res;
            }
            else
            {
                int res=0;
                for(int i=0;i<n;i++)
                {
                    if(i<K)
                    {
                        res+=-A[i];
                    }
                    else
                    {
                        res+=A[i];
                    }
                }
                return res;
            }
        }
        else
        {
            if(K<=neg)
            {
                int res=0;
                for(int i=0;i<n;i++)
                {
                    if(i<K)
                    {
                        res+=-A[i];
                    }
                    else
                    {
                        res+=A[i];
                    }
                }    
                return res;
            }
            else
            {
                int count=K-neg;
                int res=0;
                for(int i=0;i<n;i++)
                {
                    if(A[i]<0)
                    {
                        res+=-A[i];
                    }
                    else
                    {
                        res+=A[i];
                    }
                }
                if(1==count%2)
                {
                    res-=2*min(min_pos,-max_neg);
                }
                return res;
            }
        }      
    }
};

太冗长了,百度了下大牛的解法,真TM简洁啊!

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& A, int K) 
    {
        int n=A.size();
        sort(A.begin(),A.end());
        for(auto &v:A)
        {
            if(v<0 && K>0)
            {
                v=-v;
                K--;
            }
        }
        sort(A.begin(),A.end());
        if(K%2==1)
        {
            A[0]=-A[0];
        }
        int ans=0;
        for(auto v:A)
        {
            ans+=v;
        }
        return ans;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_27060423/article/details/88541586