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

目录

一、(leetcode 1005)K次取反后最大化的数组和

二、(leetcode 134)加油站

三、(leetcode 135)分发糖果


一、(leetcode 1005)K次取反后最大化的数组和

力扣题目链接

状态:了解思路后AC。

将数组按照绝对值大小从大到小排序,从前向后遍历如果遇到负数将其变为正数,k--,如果遍历完成之后k不为0,就反复转变绝对值最小的元素知道把次数用完,最后对数组求和即可。这道题的思路更像是按照题目的思路来进行而不是遵循一个固定的代码结构,具体说用了什么算法的话不好和贪心联想,这也表明了贪心问题的灵活性

class Solution {
public:
    static bool cmp(int a, int b){
        return abs(a) > abs(b);
    }
    int largestSumAfterKNegations(vector& nums, int k) {
        sort(nums.begin(), nums.end(), cmp);
        int len = nums.size();
        for(int i = 0; i < len; ++i){
            if(nums[i] < 0 && k > 0){
                nums[i] *= -1;
                k--;
            }
        }
        if(k % 2 == 1) nums[len-1] *= -1;
        int res = 0;
        for(int n : nums) res += n;
 
        return res;
    }
};

二、(leetcode 134)加油站

力扣题目链接

状态:暴力AC,贪心没思路。

注意从局部最优推导出全局最优可以判断为严格的贪心算法

class Solution {
public:
    int canCompleteCircuit(vector& gas, vector& cost) {
        int curSum = 0;
        int totalSum = 0;
        int start = 0;
        for (int i = 0; i < gas.size(); i++) {
            curSum += gas[i] - cost[i];
            totalSum += gas[i] - cost[i];
            if (curSum < 0) {   // 当前累加rest[i]和 curSum一旦小于0
                start = i + 1;  // 起始位置更新为i+1
                curSum = 0;     // curSum从0开始
            }
        }
        if (totalSum < 0) return -1; // 说明怎么走都不可能跑一圈了
        return start;
    }
};

三、(leetcode 135)分发糖果

力扣题目链接

状态:查看思路后AC。

class Solution {
public:
    int candy(vector& ratings) {
        vector candyVec(ratings.size(), 1);
        // 从前向后
        for (int i = 1; i < ratings.size(); i++) {
            if (ratings[i] > ratings[i - 1]) candyVec[i] = candyVec[i - 1] + 1;
        }
        // 从后向前
        for (int i = ratings.size() - 2; i >= 0; i--) {
            if (ratings[i] > ratings[i + 1] ) {
                candyVec[i] = max(candyVec[i], candyVec[i + 1] + 1);
            }
        }
        // 统计结果

        int result = 0;
        for (int i = 0; i < candyVec.size(); i++) result += candyVec[i];
        return result;
    }
};

你可能感兴趣的:(代码随想录二刷,算法,leetcode,数据结构)