1005. K 次取反后最大化的数组和
这里说一下卡哥和我的区别,基本思路是一样的, 只是卡哥这里只需要一次排序,而我这边排了两次;
卡哥思路:
1.按照绝对值大小从大到小排序
2.从前往后遍历,遇到负数将其转换为整数,并k--;
3.如果最后k还大于0且为奇数,则减去2倍最小的数;
4.求和
我的思路:
1.从小到大排序;
2.从前往后遍历,求遍历值的和,如果当前数为负数,则增加其负数,同时k--;
3.如果最后k还大于0且为奇数,再从小到大排序,减去2倍最小的数;
给你一个整数数组 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] 。class Solution { //我的思路
public:int largestSumAfterKNegations(vector<int>& nums, int k) {sort(nums.begin(), nums.end());int res = 0;for(int i = 0; i < nums.size(); i++){if (nums[i] < 0 and k > 0){nums[i] = - nums[i];k--;}res += nums[i];}sort(nums.begin(), nums.end());if (k > 0 and k % 2 == 1){res = res - 2 * nums[0];}return res;}
};class Solution {
static bool cmp(int a, int b) {return abs(a) > abs(b);
}
public:int largestSumAfterKNegations(vector<int>& A, int K) {sort(A.begin(), A.end(), cmp); // 第一步for (int i = 0; i < A.size(); i++) { // 第二步if (A[i] < 0 && K > 0) {A[i] *= -1;K--;}}if (K % 2 == 1) A[A.size() - 1] *= -1; // 第三步int result = 0;for (int a : A) result += a; // 第四步return result;}
};
134. 加油站
135. 分发糖果