給定一個整數數組 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;
}
};