代码随想录算法训练营第17期第34天 | 1005. K 次取反后最大化的数组和、134. 加油站、135. 分发糖果

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& 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& 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. 分发糖果

你可能感兴趣的:(算法,数据结构)