算法D33 | 贪心算法3 | 1005.K次取反后最大化的数组和 134. 加油站 135. 分发糖果

1005.K次取反后最大化的数组和

本题简单一些,估计大家不用想着贪心 ,用自己直觉也会有思路。

代码随想录

Python:

python 复制代码
class Solution:
    def largestSumAfterKNegations(self, nums: List[int], k: int) -> int:
        nums.sort(key=lambda x: abs(x), reverse=True) # 关键:按绝对值降序排列
        for i in range(len(nums)):
            if nums[i]<0 and k>0:
                nums[i] = -nums[i]
                k -= 1
        if k%2==1: 
            nums[-1] *= -1
        return sum(nums)

C++:

cpp 复制代码
class Solution {
static bool cmp(int a, int b) {
    return abs(a) > abs(b);
}
public:    
    int largestSumAfterKNegations(vector<int>& nums, int k) {
        sort(nums.begin(), nums.end(), cmp); //注意:这里cmp是static method
        for (int i=0; i<nums.size(); i++) {
            if (nums[i]<0 && k>0) {
                nums[i] *= -1;
                k--;
            }
        }
        if (k%2==1) nums[nums.size()-1] *= -1;
        int ans = 0;
        for (int a:nums) ans+=a;
        return ans;
    }
};

134. 加油站

本题有点难度,不太好想,推荐大家熟悉一下方法二

代码随想录

Python:

情况三是比较难想到的,从后向前看如何覆盖cum_sum of net gas.

  • 情况三:如果累加的最小值是负数,汽车就要从非0节点出发,从后向前,看哪个节点能把这个负数填平,能把这个负数填平的节点就是出发节点。
python 复制代码
class Solution:
    def canCompleteCircuit(self, gas: List[int], cost: List[int]) -> int:
        cum_sum = 0
        min_net = float('inf')
        for i in range(len(gas)):
            cum_sum += gas[i] - cost[i]
            if cum_sum < min_net:
                min_net = cum_sum
        if cum_sum < 0: return -1
        if min_net > 0: return 0
        for i in reversed(range(len(gas))):
            min_net += gas[i] - cost[i]
            if min_net >= 0:
                return i
        return -1

C++:

cpp 复制代码
class Solution {
public:
    int canCompleteCircuit(vector<int>& gas, vector<int>& cost) {
        int cumSum = 0;
        int minCumSum = INT_MAX;
        for (int i=0; i<gas.size(); i++) {
            cumSum += gas[i] - cost[i];
            if (cumSum < minCumSum) minCumSum = cumSum;
        }
        if (cumSum < 0) return -1;
        if (minCumSum > 0) return 0;
        for (int i=gas.size()-1; i>=0; i--) {
            minCumSum += gas[i] - cost[i];
            if (minCumSum >=0) return i;
        }
        return -1;
    }
};

135. 分发糖果

本题涉及到一个思想,就是想处理好一边再处理另一边,不要两边想着一起兼顾,后面还会有题目用到这个思路

代码随想录

Python:

cpp 复制代码
class Solution:
    def candy(self, ratings: List[int]) -> int:
        n = len(ratings)
        if n == 1: return 1
        ans = [1] * n 
        for i in range(1, n): # 从前往后
            if ratings[i] > ratings[i-1]:
                ans[i] = ans[i-1] + 1
        for i in reversed(range(n-1)): # 从后往前
            if ratings[i] > ratings[i+1]:
                ans[i] = max(ans[i], ans[i+1]+1)
        return sum(ans)

C++:

cpp 复制代码
class Solution {
public:
    int candy(vector<int>& ratings) {
        if (ratings.size()==1) return 1;
        vector<int> 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 ans = 0;
        for (int c: candyVec) ans += c;
        return ans;
    }
};
相关推荐
西柚与蓝莓1 小时前
【开源开放体系总结】
python
StrokeAce1 小时前
linux桌面软件(wps)内嵌到主窗口后的关闭问题
linux·c++·qt·wps·窗口内嵌
hsling松子4 小时前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
家有狸花4 小时前
VSCODE驯服日记(三):配置C++环境
c++·ide·vscode
belldeep4 小时前
python:reportlab 将多个图片合并成一个PDF文件
python·pdf·reportlab
dengqingrui1235 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝5 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O5 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King6 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家6 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法