算法D31 | 贪心算法1 | 455.分发饼干 376. 摆动序列 53. 最大子序和

贪心算法其实就是没有什么规律可言 ,所以大家了解贪心算法 就了解它没有规律的本质就够了。

不用花心思去研究其规律, 没有思路就立刻看题解。

基本贪心的题目 有两个极端,要不就是特简单,要不就是死活想不出来。

学完贪心之后再去看动态规划,就会了解贪心和动规的区别。

理论基础

代码随想录

455.分发饼干

代码随想录

两个数组先排序,倒着看最大的cookie能满足的孩子,向前计数。

Python:

python 复制代码
class Solution:
    def findContentChildren(self, g: List[int], s: List[int]) -> int:
        g.sort()
        s.sort()
        i = len(g)-1
        j = len(s)-1
        result = 0
        while j>=0 and i>=0:
            if s[j]>=g[i]:
                result += 1
                j -= 1
            i -= 1
        return result

C++:

C++版本用i--实现也算简洁。

cpp 复制代码
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        sort(g.begin(), g.end());
        sort(s.begin(), s.end());
        int result=0;
        int i = g.size()-1;
        int j = s.size()-1;
        for (int i=g.size()-1; i>=0; i--) {
            if (j>=0 && s[j]>=g[i]) {
                result++;
                j--;
            }
        }
        return result;
    }
};

376. 摆动序列

代码随想录

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。

主要难点:要考虑平坡的情况。

Python:

python 复制代码
class Solution:
    def wiggleMaxLength(self, nums: List[int]) -> int:
        n = len(nums)
        if n<=1: return n
        prev_diff = nums[1] - nums[0]
        n_diff = int(prev_diff!=0)
        for i in range(2, n):
            cur_diff = nums[i] - nums[i-1]
            if cur_diff * prev_diff < 0 or (prev_diff==0 and cur_diff!=0):
                n_diff += 1
                prev_diff = cur_diff 
        return n_diff + 1

C++:

cpp 复制代码
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size()<=1) return nums.size();
        int preDiff = 0;
        int curDiff = 0;
        int result = 1;
        for (int i=0; i<nums.size()-1; i++) {
            curDiff = nums[i+1] - nums[i];
            if ((preDiff<=0 && curDiff>0) || (preDiff>=0 && curDiff<0)) {
                result++;
                preDiff = curDiff;
            }
        }
        return result;
    }
};

53. 最大子序和

代码随想录

局部最优:当前"连续和"为负数的时候立刻放弃,从下一个元素重新计算"连续和",因为负数加上下一个元素 "连续和"只会越来越小。

全局最优:选取最大"连续和"

局部最优的情况下,并记录最大的"连续和",可以推出全局最优

从代码角度上来讲:遍历 nums,从头开始用 count 累积,如果 count 一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 count 了,因为已经变为负数的 count,只会拖累总和。

这相当于是暴力解法中的不断调整最大子序和区间的起始位置

Python贪心:

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        result = float('-inf')
        count = 0
        for num in nums:
            count += num
            if count > result:
                result = count
            if count <= 0:
                count = 0
        return result

Python动态规划:

python 复制代码
class Solution:
    def maxSubArray(self, nums: List[int]) -> int:
        
        curSum, maxSum = nums[0], nums[0]
        
        for num in nums[1:]:
            curSum = max(num, curSum + num)
            maxSum = max(maxSum, curSum)
        
        return maxSum

C++贪心:

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT32_MIN;
        int count = 0;        
        for (int i=0; i<nums.size(); i++) {
            count += nums[i];
            if (count>result) result = count;
            if (count<= 0) count=0;
        }
        return result; 
    }
};

C++动态规划:

cpp 复制代码
class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int curSum = nums[0];
        int maxSum = nums[0];
        for (int i=1; i<nums.size(); i++) {
            curSum = max(nums[i], curSum+nums[i]);
            maxSum = max(maxSum, curSum);
        }
        return maxSum;
    }
};
相关推荐
毕设源码-邱学长13 分钟前
【开题答辩全过程】以 基于Python的Bilibili平台数据分析与可视化实现为例,包含答辩的问题和答案
开发语言·python·数据分析
StarPrayers.14 分钟前
自蒸馏学习方法
人工智能·算法·学习方法
大锦终15 分钟前
【动规】背包问题
c++·算法·动态规划
咚咚王者24 分钟前
人工智能之编程进阶 Python高级:第十一章 过渡项目
开发语言·人工智能·python
犯困的土子哥34 分钟前
C++:哈希表
c++·哈希算法
A尘埃1 小时前
大模型应用python+Java后端+Vue前端的整合
java·前端·python
Code Warrior1 小时前
【Linux】Socket 编程预备知识
linux·网络·c++
A尘埃1 小时前
LLM大模型评估攻略
开发语言·python
智者知已应修善业1 小时前
【c语言蓝桥杯计算卡片题】2023-2-12
c语言·c++·经验分享·笔记·算法·蓝桥杯
littlepeanut.top1 小时前
C++中将FlatBuffers序列化为JSON
开发语言·c++·json·flatbuffers