Leetcode1005
1.问题描述
2.解决方案
解法一(104ms):
没什么好说的因为每次反转最小的数无论胜负肯定都是最赚的,所以反转一次排一次序,再反转!
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
int i=0;
while(i<k){
sort(nums.begin(),nums.end());
nums[0]=-nums[0];
i++;
}
return accumulate(nums.begin(),nums.end(),0);
}
};
解法二(4ms):
思路已经很清晰了其实就是分两步进行贪心算法,省去了反转完再排序,只要排一次序就好!再简单的题也要想着去用贪心的局部最优和全局最优去解释!
class Solution1 {
public:
static bool cmp(int a,int b){
return abs(a)>abs(b);
}
int largestSumAfterKNegations(vector<int>& nums, int k) {
//1.按绝对值从大到小
sort(nums.begin(),nums.end(),cmp);
//2.从绝对值大到小遍历,遇到负数变为正数,并k--
for(int i=0;i<nums.size();i++){
if(k==0) break;
if(nums[i]<0){
nums[i]=-nums[i];
k--;
}
}
if(k==0) return accumulate(nums.begin(),nums.end(),0);
//3.如果k>0,那证明负数都用完了那就把最小的正数反复反转
//nums[nums.size()-1] = ((-1)^(k%2)) * nums[nums.size()-1]; //直接求 (-1)^(1)==-2 所以不对
nums[nums.size()-1] = pow(-1,k%2) * nums[nums.size()-1];
//4.k肯定用完了
return accumulate(nums.begin(),nums.end(),0);
}
};