Leetcode 1005. K 次取反後最大化的陣列和(終於解決)
阿新 • • 發佈:2022-05-20
給你一個整數陣列 nums 和一個整數 k ,按以下方法修改該陣列:
- 選擇某個下標 i 並將 nums[i] 替換為 -nums[i] 。
重複這個過程恰好 k 次。可以多次選擇同一個下標 i 。
以這種方式修改陣列後,返回陣列 可能的最大和 。
示例 1:
輸入:nums = [4,2,3], k = 1
輸出:5
解釋:選擇下標 1 ,nums 變為 [4,-2,3] 。
示例 2:
輸入:nums = [3,-1,0,2], k = 3
輸出:6
解釋:選擇下標 (1, 2, 2) ,nums 變為 [3,1,0,2] 。
示例 3:
輸入:nums = [2,-3,-1,5,-4], k = 2 輸出:13 解釋:選擇下標 (1, 4) ,nums 變為 [2,3,-1,5,4] 。
提示:
- 1 <= nums.length <= 10^4
- -100 <= nums[i] <= 100
- 1 <= k <= 10^4
主要思路:
1.先排序
2.判斷負數個數
1)如果負數個數大於等於要反轉的次數直接從最小值開始一次反轉K次
2)如果負數小於要反轉的次數則先將所有負數轉變為正數,然後排一次序,之後將剩餘次數對2取餘即可
Code:
class Solution { public: int largestSumAfterKNegations(vector<int>& nums, int k) { sort(nums.begin(),nums.end()); int index=-1; int sum=0; bool flag=false; for(int i=0;i<nums.size();i++) { if(nums[i]>0) { index=i; break; } } if((index)>=k)//負數個數 { for(int i=0;i<nums.size();i++) { if(i<k) { sum-=nums[i]; } else sum+=nums[i]; } } else { int cnt=0; for(int i=0;i<nums.size();i++) { if(nums[i]>0) { break; } else { nums[i]=-nums[i]; cnt++; } } sort(nums.begin(),nums.end()); k=(k-cnt)%2; cout<<k<<endl; for(int i=0;i<nums.size();i++) { if(i<k) { if(nums[i]==0) { k=0; } sum+=(-nums[i]); } else sum+=nums[i]; } } cout<<sum<<endl; return sum; } };