DAY31:贪心算法入门455、53、376

理论基础

贪心算法的基本思路是通过局部最优从而达到全局最优,但是有时候局部最优并不一定导致全局最优,这样就需要动态规划的方法。但一部分题目是能通过贪心得到的。贪心的证明一般用到数学归纳法和反证法。在实际的问题中,没有统一的代码套路和模板,具体问题具体分析。

Leetcode: 455 分发饼干

一种思路是先把小饼干给小胃口的人

时间复杂度:O(nlogn)

空间复杂度:O(1)

复制代码
class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int index = 0;
        sort(g.begin(), g.end());//注意需要先排序
        sort(s.begin(), s.end());
        for(int i = 0; i < s.size(); i++){//饼干的个数
            if(index < g.size() && g[index] <= s[i]){//从最小的胃口开始
                index++;
            }
        }
        return index;
    }
};

另一种思路是把大饼干先给大胃口的人

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

Leetcode: 53 最大子序和

贪心的思路是,设计一个count,当连续和为负数的时候,加上后面的数字就会变小,因此只要连续和不为负数就可以继续往下贪心。

时间复杂度:O(n)

空间复杂度:O(1)

复制代码
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];//计算count,元素和
            if(count > result) result = count;
            if(count <= 0) count = 0;//如果为负数了,就重新更新
        }
        return result;

    }
};

可以看到贪心算法的代码还算简单,但是思路并不是很好想到。

Leetcode: 376 摆动序列

这道题思路太复杂了,但是代码很简单,这次先学习思路,之后还需要继续刷题

代码随想录

复制代码
class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        if (nums.size() <= 1) return nums.size();
        int curDiff = 0; // 当前一对差值
        int preDiff = 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; // 注意这里,只在摆动变化的时候更新prediff
            }
        }
        return result;
    }
};
相关推荐
碧海银沙音频科技研究院1 分钟前
基于炬芯ATS3089X音箱的音乐播放歌词显示功能实现
人工智能·驱动开发·嵌入式硬件·算法
2603_969579287 分钟前
怎样取消电脑上的自动备份?不同来源的关闭方法
学习
CV@CV13 分钟前
世界模型环境预测与内在表征基础原理
人工智能·学习·边缘计算·量子计算·具身智能
知识分享小能手14 分钟前
C学习教程,从入门到精通,C语言数组 —— 知识点详解(8)
c语言·学习·算法
hetao173383718 分钟前
联盟场-提高组-R2 & ZYZSC-S-Round 5
c++·算法
卿卿的产品经理日记20 分钟前
【AI产品经理实战】Day 34|计算机科学速成②:从水流开关到 Unicode,把整个电脑拆成一长串 0 和 1
人工智能·笔记·科技·学习·产品经理
其实防守也摸鱼29 分钟前
Codex 下载与本地部署实战指南
linux·服务器·前端·数据库·算法·ai
南极企鹅30 分钟前
生产环境gc文件分析
java·jvm·算法
希洛兔32 分钟前
原码、反码、补码:一张图讲透计算机里的负数表示
算法·面试
X北辰北36 分钟前
C++ 进阶第二阶段总结|STL容器全家桶、迭代器失效、STL算法、序列化入门(工程必备)
开发语言·c++·算法