当前位置: 首页 > article >正文

算法打卡 Day34(贪心算法)-分发饼干 + 摆动序列 + 最大子序和

文章目录

  • 理论基础
  • Leetcode 455-分发饼干
    • 题目描述
    • 解题思路
    • 类似题目
      • 2410-运动员和训练师的最大匹配数
  • Leetcode 376-摆动序列
    • 题目描述
    • 解题思路
  • Leetcode 53-最大子序和
    • 题目描述
    • 解题思路

理论基础

贪心算法的本质是选择每一阶段的局部最优,从而达到全局最优。

贪心算法没有固定的套路,其是常识性推导 + 举反例。

其一般的解题步骤可以分为四步:

  • 将问题分解为若干个子问题;
  • 找出适合的贪心策略;
  • 求解每一个子问题的最优解;
  • 将局部最优解堆叠成全局最优解

Leetcode 455-分发饼干

题目描述

https://leetcode.cn/problems/assign-cookies/description/

在这里插入图片描述

解题思路

这道题的思路可以是尽量用较小的饼干满足胃口较小的孩子的需求,在分发饼干前,需要对胃口值和饼干尺寸进行排序。

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int result = 0;
        sort(g.begin(), g.end());
        sort(s.begin(),s.end());
        int cIndex = 0;
        for (int i =0; i <s.size(); i++){
            if (cIndex<g.size() && s[i]>=g[cIndex]){
                cIndex++; result++;
            }
        }
        return result;
    }
};

类似题目

2410-运动员和训练师的最大匹配数

https://leetcode.cn/problems/maximum-matching-of-players-with-trainers/description/

在这里插入图片描述

class Solution {
public:
    int matchPlayersAndTrainers(vector<int>& players, vector<int>& trainers) {
        sort(players.begin(),players.end());
        sort(trainers.begin(),trainers.end());
        int count = 0;
        int j = 0;
        for (int i = 0; i < trainers.size();i++){
            if (j < players.size() && trainers[i]>=players[j]){
                j++; count++;
            }
        }
        return count;
    }
};

Leetcode 376-摆动序列

题目描述

https://leetcode.cn/problems/wiggle-subsequence/description/
在这里插入图片描述

解题思路

寻找摆动序列可以寻找序列中的转折点,可以通过画图清楚的描述出来。

我们通过 prediff 和 curdiff 记录当前数字前和后的坡度值,从而比较当前值是否为转折点

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int curdiff = 0;
        int prediff = 0;
        int count = 1;
        if (nums.size()==1) return count;
        for (int i = 0; i < nums.size()-1;i++){
            curdiff = nums[i+1]- nums[i];
            if (curdiff > 0 && prediff <= 0 || curdiff < 0 && prediff >= 0){
                count++;
                prediff = curdiff;
            }
        }
        return count;
    }
};

Leetcode 53-最大子序和

题目描述

https://leetcode.cn/problems/subsets-ii/description/

在这里插入图片描述

解题思路

遍历整个数组,判断是否要继续进行累计还是重新开始的规则是,判断累加和是否为正数,只有当累加和不小于 0 时,继续进行累计才可以保证不拖累后续的数字

class Solution {
public:
    int maxSubArray(vector<int>& nums) {
        int result = INT_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;
    }
};

http://www.kler.cn/a/313012.html

相关文章:

  • 【Python】爬虫通过验证码
  • NVIDIA NIM 简介
  • Python如何用正则表达式匹配并处理文件名
  • 【PGCCC】Postgresql Toast 原理
  • 通用项目工程的过程视图概览
  • Docker网络和overlay的基础讲解
  • 《粮油与饲料科技》是什么级别的期刊?是正规期刊吗?能评职称吗?
  • 【设计模式-桥接】
  • Visual Studio 引入外部静态库与动态库
  • 【双语新闻】AGI安全与对齐,DeepMind近期工作
  • Instagram全面升级“青少年账号”保护措施,除了信息分类过滤,还应从根源加强内容审核
  • 八、explicit关键字在C++中的用法
  • 【第十三章:Sentosa_DSML社区版-机器学习聚类】
  • dedecms——四种webshell姿势
  • 2024年“华为杯”研赛第二十一届中国研究生数学建模竞赛解题思路|完整代码论文集合
  • DataX--Web:图形化界面简化大数据任务管理
  • 开发易忽视的问题:InnoDB 行锁设计与实现
  • Pycharm中虚拟环境依赖路径修改
  • LeetCode 面试经典150题 67.二进制求和
  • istio中使用serviceentry结合egressgateway实现多版本路由
  • JFinal整合Websocket
  • 大模型中常见 loss 函数
  • 关于“华为杯”第二十一届中国研究生数学建模竞赛赛题下载及提交作品的重要提醒
  • pytorch实现RNN网络
  • Vue使用qrcodejs2-fix生成网页二维码
  • 解决 GitLab CI/CD 中的 `413 Request Entity Too Large` 错误