贪心
解法一:每次都取数组中的最小值进行取反(使用小根堆)
解法二:
先把数组按绝对值由打到小进行排序
1. 把负数取反(1.负数的数量小于k,那么每次都按绝对值的最大值进行取反---排序后则是遇到负数即取反 2.输出的数量大于k,则将所有的负数取反后,跳入第二步)
2. 再把正数中最小的取反(次数为k-负数的个数)
class Solution {
public:
int largestSumAfterKNegations(vector<int>& nums, int k) {
// --------------------方法一--------------------------
// 使用优先队列,小根堆,每次都取最小的那个改变其值
// priority_queue<int,vector<int>,greater<int>> pq;
// for(auto n:nums){
// pq.push(n);
// }
// // 每次都选择最小进行取反
// for(int i=0;i<k;i++){
// int min_r = pq.top();
// pq.pop();
// min_r = -min_r;
// pq.push(min_r);
// }
// int sum =0;
// // 加和
// while(!pq.empty()){
// sum+=pq.top();
// pq.pop();
// }
// return sum;
//----------------------方法二-----------------------------
// 首先看反转的次数是否比负数的次数大
// 1.先按照绝对值进行排序,保证优先取反最小的负数
// 2.当k为使用完时,对数组中最小的整数进行剩下次数的取反(可以直接查看剩下k的奇偶,如果为偶则为其本身,如果为奇,则为其相反数)
if(nums.size()==0){
return 0;
}
sort(nums.begin(),nums.end(),[](int a,int b)->int{return abs(a)>abs(b);}); // 按绝对值由大到小排序
for(int i=0;i<nums.size();i++){
if(nums[i]<0&&k){
nums[i] = -nums[i];
k--;
}
}
if(k&&k%2==1){
nums[nums.size()-1]= -nums[nums.size()-1];
}
int sum = 0;
for(auto n:nums){
sum+=n;
}
return sum;
}
};