LeetCode—— 1005 K次取反后最大化的数组和

问题描述

给定一个整数数组 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. 1 <= A.length <= 10000
  2. 1 <= K <= 10000
  3. -100 <= A[i] <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/maximize-sum-of-array-after-k-negations
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

执行结果

代码描述

思路:把每种情况都列出来了,导致程序就很长很长。下面代码还有很大的优化空间。

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& A, int K) {
        sort(A.begin(), A.end());  // 对数组A排序,由小到大
        int split = -1;            // 记录最大的负数
        int zero = 0;              // 记录是否有0
        int sum = 0;
        // 找到最大的负数的位置,0的位置
        for(int i = 0; i < A.size(); ++i)
        {
            if(A[i] < 0)
                split = i;
            else if(A[i] == 0)
                zero = 0;
            else if(A[i] > 0)
                break;
        }
        if(split == -1)  // 没有负数
        {
            if(K%2 == 1)  // 特殊处理一下第一个数
                sum -= A[0];
            else 
                sum += A[0];
            for(int i = 1; i < A.size(); ++i)
            {
                sum += A[i];
            }
        }
        else if(split != -1)  // 有负数
        {
            if(split >= K-1)  // 负数多,名额少
            {
                for(int i = 0; i < K; ++i)
                {
                    sum -= A[i];
                }
                for(int i = K; i < A.size(); ++i)
                {
                    sum += A[i];
                }
            }
            else  // 负数少,名额多
            {
                for(int i = 0; i < split+1; ++i)
                {
                    sum -= A[i];
                }
                if(zero == 1)  // 存在0
                {
                    for(int i = split+1; i < A.size(); ++i)
                    {
                        sum += A[i];
                    }
                }
                else if(zero == 0)  // 没有0
                {
                    if((K-split-1)%2 == 0)  // 剩余偶数个
                    {
                        for(int i = split+1; i < A.size(); ++i)
                        {
                            sum += A[i];
                        }
                    }
                    else
                    {
                        if(split+1 < A.size())
                        {
                            if(abs(A[split]) < A[split+1])
                            {
                                sum += (A[split]*2);
                                int j = split+1;
                                while(j < A.size())
                                {
                                    sum += A[j];
                                    ++j;
                                }
                            }
                            else
                            {
                                sum -= A[split+1];
                                int j = split+2;
                                while(j < A.size())
                                {
                                    sum += A[j];
                                    ++j;
                                }
                            }
                        }
                    }
                }
            }
        }
        return sum;
    }
};

 

发布了396 篇原创文章 · 获赞 114 · 访问量 5万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: Age of Ai 设计师: meimeiellie

分享到微信朋友圈

×

扫一扫,手机浏览