题目:1005. K 次取反后最大化的数组和
思路
贪心法;
用绝对值大小排序,自己写一个比较函数,
static bool compare(int a, int b)
{return abs(a) > abs(b);
}
注意这样写出来是降序排列;
2次贪心:
(1)按照绝对值大小排序,排序之后比如:输入nums = [2,-3,-1,5,-4], k = 2
,排序之后:nums = [5, -4, -3, 2, -1]
,再从绝对值最大的负数开始翻转(翻牌子( ̄▽ ̄)");
(2)在所有负数都翻转完毕之后,如果还有剩余翻转次数,那么就对绝对值最小的正数进行翻转。剩余次数为偶数,那么就结果刚好保持不变,如为奇数,结果相当于翻转一次;
代码
class Solution {// 比较绝对值大小
static bool compare(int a, int b)
{return abs(a) > abs(b);
}public:int largestSumAfterKNegations(vector<int>& nums, int k) {int i, times = k, sum = 0, size;// times : 能反转的次数sort(nums.begin(), nums.end(), compare);// 降序size = nums.size();cout << endl;for(i = 0; i < size; i++){if(nums[i] < 0 && times > 0){nums[i] = -nums[i];times--;}}if(times > 0){// 奇数if(times % 2 == 1){nums[size-1] = -nums[size-1];}}for(i = 0; i < nums.size(); i++){sum += nums[i];}return sum;}
};
贪心简单题用来培养分析过程,以免将来遇见难题不知道如何下手;
参考
代码随想录:1005.K次取反后最大化的数组和