Leetcode 1005. K 次取反後最大化的數組和 1005. Maximize Sum Of Array After K Negations

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 <= A.length <= 10000
1 <= K <= 10000
-100 <= A[i] <= 100

執行用時 : 8 ms, 在Maximize Sum Of Array After K Negations的C++提交中擊敗了98.68% 的用戶
內存消耗 : 8.8 MB, 在Maximize Sum Of Array After K Negations的C++提交中擊敗了15.07% 的用戶

比較煩的是,每次一開始考慮的都不全,得提交了幾次才行,我太菜了,哎

class Solution {
public:
    int largestSumAfterKNegations(vector<int>& A, int K) {
        sort(A.begin(),A.end());
        int nega=0,res=0;  //nega是負數的數量
        for(int i=0;i<A.size();i++){
            if(A[i]<0) nega++;
            else break;
        }
        if(nega>=K){  //負數的數量大於等於K,就把最小的K個負數轉爲正數
           for(int i=0;i<K;i++){
            A[i]=-A[i];
            } 
        }else{        //負數的數量小於K
            for(int i=0;i<nega;i++){ //先把所有負數轉爲正數
            A[i]=-A[i];
            }                        //餘下K-nega的轉換次數,如果偶數,全員正數就不管啦
            if((K-nega)%2==1){       //如果奇數,會剩下一個不得不爲負數的數,去找最小的那個
                if(nega==0) A[nega]=-A[nega];  //如果只有正數,就把最小的正數變爲負數
                else if(A[nega-1]>A[nega]) A[nega]=-A[nega]; //一開始負數最大的和正數最小的比較,看看要哪一個絕對值更小,去做負數弟弟;這邊是正數比較小
                else A[nega-1]=-A[nega-1]; //負數最大的那個比較小的情況
            }
        }
        for(int i=0;i<A.size();i++){
            res+=A[i];
        }
        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章