1005. K 次取反後最大化的陣列和
阿新 • • 發佈:2021-05-23
目錄
一.問題
給定一個整數陣列 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
來源:力扣(LeetCode)
連結:題目描述
二.分析
(1)首先整理題意:我們要經過k次取反操作然後使得陣列和最大。
(2)要想使陣列和最大,那麼我們首先可以將負數變為正數,所以我們先對陣列從小到大進行排序。然後使用一個for迴圈,直到k次機會用完或者遍歷一遍完成後退出迴圈。
(3)接下來如果k次機會已經用完或者剩下機會是偶數個,那麼我們直接求和返回。反之,我們再對陣列進行一次排序(這時數組裡面的元素均為非負數),這個時候因為都是非負數,所以我們只要對最小的那個數操作就好了,因為上面已經排除了剩下偶數個機會的情況,所以此時將最小數直接取反求和返回即可。
三.程式碼
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
//先從小到大排一次序
sort(nums.begin(),nums.end());
//在k滿足的情況下將負數變為正數
for(int i=0;i<nums.size();i++)
{
if(nums[i]<0 && k>0)
{
k-- ;
nums[i]=-nums[i];
}
}
if(k%2!=0) {sort(nums.begin(),nums.end());nums[0]=-nums[0];}
//求和
int sum=0;
for(int i=0;i<nums.size();i++)
{
sum+=nums[i];
}
return sum;
}
};