代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和

news2024/12/27 2:54:13

代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和

1.贪心算法理论基础

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

  • 这么说有点抽象,来举一个例子:

    例如,有一堆钞票,你可以拿走十张,如果想达到最大的金额,你要怎么拿?

    指定每次拿最大的,最终结果就是拿走最大数额的钱。

    每次拿最大的就是局部最优,最后拿走最大数额的钱就是推出全局最优。

  • 再举一个例子如果是 有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。

  • 贪心算法并没有固定的套路。难点就是如何通过局部最优,推出整体最优。

  • 靠自己手动模拟,如果模拟可行,就可以试一试贪心策略,如果不可行,可能需要动态规划。

  • 如何验证可不可以用贪心算法呢?

    • 最好用的策略就是举反例,如果想不到反例,那么就试一试贪心吧
  • 贪心算法一般分为如下四步:

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

2.题目

2.1分发饼干

  • 题目链接:455. 分发饼干 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:贪心算法,你想先喂哪个小孩?| LeetCode:455.分发饼干_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0455.%E5%88%86%E5%8F%91%E9%A5%BC%E5%B9%B2.html

  • 解题思路:贪心

    • 为了满足更多的小孩,就不要造成饼干尺寸的浪费。

      大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子,那么就应该优先满足胃口大的。

    • 这里的局部最优就是大饼干喂给胃口大的,充分利用饼干尺寸喂饱一个,全局最优就是喂饱尽可能多的小孩

      在这里插入图片描述

  • 代码:

    class Solution {
        public int findContentChildren(int[] g, int[] s) {
            Arrays.sort(g);
            Arrays.sort(s);
            int result = 0;
            int index = s.length -1;
            for(int i = g.length - 1;i >= 0;i--){
                if(index >= 0 && s[index] >= g[i]){
                    result++;
                    index--;
                }
            }
            return result;
        }
    }
    
  • 总结:

    • 小饼干先喂饱小胃口也可以

2.2摆动序列

  • 题目链接:376. 摆动序列 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:贪心算法,寻找摆动有细节!| LeetCode:376.摆动序列_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0376.%E6%91%86%E5%8A%A8%E5%BA%8F%E5%88%97.html

  • 解题思路:贪心

    • 在这里插入图片描述

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

      整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列

    • 在计算是否有峰值的时候,大家知道遍历的下标 i ,计算 prediff(nums[i] - nums[i-1]) 和 curdiff(nums[i+1] - nums[i]),如果prediff < 0 && curdiff > 0 或者 prediff > 0 && curdiff < 0 此时就有波动就需要统计。

    • 本题要考虑三种情况:

      1. 情况一:上下坡中有平坡

        在这里插入图片描述

      2. 情况二:数组首尾两端

        • 针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,result 初始为 1(默认最右面有一个峰值)

          在这里插入图片描述

      3. 情况三:单调坡中有平坡

        在这里插入图片描述

        • 我们应该什么时候更新 prediff 呢?
          • 我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行,这样 prediff 在 单调区间有平坡的时候 就不会发生变化,造成我们的误判。
  • 代码:

    class Solution {
        public int wiggleMaxLength(int[] nums) {
            if(nums.length <= 1){
                return nums.length;
            }
            //当前差值
            int curDiff = 0;
            //上一个差值
            int preDiff = 0;
            //默认最右边有一个峰值
            int count = 1;
            //遍历到倒数第二个就行,最右边的已经默认了
            for(int i = 0;i < nums.length -1;i++){
                curDiff = nums[i + 1] - nums[i];
                if((curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)){
                    count++;
                    preDiff = curDiff;
                }
            }
            return count;
        }
    }
    
  • 总结:

    • 为什么 preDiff = curDiff 放在条件判断内部这个位置?
      • 为了保证只有在波动方向改变时才更新 preDiff。如果波动方向没有变化(即不满足 (curDiff > 0 && preDiff <= 0) || (curDiff < 0 && preDiff >= 0)),那么 preDiff 保持不变,等待下一次有效的波动。

2.3最大子序和

  • 题目链接:53. 最大子数组和 - 力扣(LeetCode)

    在这里插入图片描述

  • 视频讲解:贪心算法的巧妙需要慢慢体会!LeetCode:53. 最大子序和_哔哩哔哩_bilibili

  • 文档讲解:https://programmercarl.com/0053.%E6%9C%80%E5%A4%A7%E5%AD%90%E5%BA%8F%E5%92%8C.html

  • 解题思路:贪心

    • 局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。
    • 全局最优:选取最大“连续和”
    • 局部最优的情况下,并记录最大的“连续和”,可以推出全局最优
  • 代码:

    class Solution {
        public int maxSubArray(int[] nums) {
            int result = Integer.MIN_VALUE;
            int count = 0;
            for(int i = 0;i < nums.length;i++){
                count += nums[i];
                if(count > result){
                    result = count;
                }
                if(count < 0){
                    count = 0;
                }
            }
            return result;
        }
    }
    
  • 总结:

    • 遇到连续和为负数才更新起始位置。并不是遇到负数就更新。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120160.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

论文《Graph Neural Networks with convolutional ARMA filters》笔记

【ARMA 2021 PAMI】本文介绍了一种新型的基于**自回归移动平均&#xff08;Auto-Regression Moving Average&#xff0c;ARMA&#xff09;**滤波器的图卷积层。与多项式滤波器相比&#xff0c;ARMA滤波器提供了更灵活的频率响应&#xff0c;对噪声更鲁棒&#xff0c;能更好地捕…

【每日一题】LeetCode 104.二叉树的最大深度(树、深度优先搜索、广度优先搜索、二叉树)

【每日一题】LeetCode 104.二叉树的最大深度&#xff08;树、深度优先搜索、广度优先搜索、二叉树&#xff09; 题目描述 给定一个二叉树 root&#xff0c;我们需要计算并返回该二叉树的最大深度。二叉树的最大深度是指从根节点到最远叶子节点的最长路径上的节点数。 思路分…

Uni-app 开发鸿蒙 App 全攻略

一、开发前的准备工作 开发鸿蒙 App 之前&#xff0c;我们需要做好充分的准备工作。首先是工具的安装与配置。 Node.js 的安装&#xff1a;推荐使用 LTS 版本的 Node.js。可以前往 Node.js 的官方网站下载适合自己操作系统的安装包&#xff0c;如 Windows 用户根据自己的系统版…

OpenHarmony鸿蒙开发( Beta5.0)智能风扇设备开发实践

样例简介 智能风扇设备不仅可以接收数字管家应用下发的指令来控制风扇开启的时间&#xff0c;调节风扇挡位&#xff0c;更改风扇定时时间&#xff0c;而且还可以加入到数字管家的日程管理中。通过日程可以设定风扇相关的任务&#xff0c;使其在特定的时间段内&#xff0c;风扇…

【MySQL】MySQL表的操作

目录 创建表的语法创建表的示例查看表的结构进入数据库查看自己在哪个数据库查看自己所在数据库都有哪些表查看表的详细信息查看创建表时的详细信息 修改表修改表名修改表的内容插入几个数据增加一列修改一列的所有属性删除某一列修改列的名称 删除表 创建表的语法 CREATE TAB…

DFS算法专题(二)——穷举vs暴搜vs深搜vs回溯vs剪枝【OF】决策树

目录 1、决策树 2、算法实战应用【leetcode】 2.1 题一&#xff1a;全排列 2.2.1 算法原理 2.2.2 算法代码 2.2 题二&#xff1a;子集 2.2.1 算法原理【策略一】 2.2.2 算法代码【策略一】 2.2.3 算法原理【策略二&#xff0c;推荐】 2.2.4 算法代码【策略二&#x…

图像去噪技术:传统中值滤波与改进中值滤波算法的比较

在数字图像处理中&#xff0c;去噪是一个至关重要的步骤&#xff0c;尤其是在图像受到椒盐噪声影响时。本文将介绍一种改进的中值滤波算法&#xff0c;并与传统的中值滤波算法进行比较&#xff0c;以展示其在去除椒盐噪声方面的有效性。 实验环境 软件&#xff1a;MATLAB图像…

Centos如何配置阿里云的yum仓库作为yum源?

背景 Centos在国内访问官方yum源慢&#xff0c;可以用国内的yum源&#xff0c;本文以阿里云yum源为例说明。 快速命令 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.bak sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.a…

宏观学习笔记:GDP分析(二)

GDP分析&#xff08;一&#xff09;主要是介绍GDP相关的定义以及核算逻辑&#xff0c;本节主要介绍GDP的分析思路。GDP分析主要是2种方法&#xff1a;总量分析和结构分析。 1. 总量分析 1.1 数值选择 一般情况下&#xff0c;分析的对象都是 官方公布的GDP当季值。 1.2 趋势规…

利用发电量和气象数据分析来判断光伏仿真系统的准确性

随着光伏产业的迅速发展&#xff0c;光伏仿真系统通过集成气象数据分析、发电量分析、投融资分析及损耗估算等功能&#xff0c;为光伏项目的全生命周期管理提供了科学依据。 光伏仿真系统集成了气象数据分析、发电量预测、投融资分析、损耗估算及光伏设计等功能。其中&#xf…

qmt量化交易策略小白学习笔记第60期【qmt编程之期权数据--基于BS模型计算欧式期权隐含波动率--内置Python】

qmt编程之获取期权数据 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 基于BS模型计算欧式期权隐含波动率 基于Black-Scholes-Merton模型,输入期权标的价格、期权行权价、期权现价、无风险利…

【880高数】高等数学一刷错题整理

第一章 函数、极限、连续 2024.8.11日 1. 2. 3. 4. 5. 2024.8.12日 1. 2. 3. 4. 5. 6. 7. 8. 2024.8.13日 1. 2. 3. 4. 2024.8.14日 1. 2. 3. 4. 5. 第二章 一元函数微分学及其应用 2024.8.15日 1. 2. 3. 4. 5. 6. 2024.8.16日 1. 2. 3. 4. 5. 2024.8.17日 1. 2. 3. 4…

哈希表 和 算法

1.哈希表的作用&#xff1a;将我们要存储的数据&#xff0c;通过关键字与位置的关系函数&#xff0c;来确定具体的位置。 2.写哈希表时常出现的问题&#xff1a;哈希冲突/矛盾&#xff1a;当多个数据满足哈希函数的映射时出现 解决的方法为&#xff1a; 1&#xff09;开放地址…

MVC设计模式与delegate

一、MVC MVC就是Model&#xff08;模型&#xff09;、View&#xff08;视图&#xff09;、Controller&#xff08;控制器&#xff09; 例如上面的 excel表&#xff0c; 数据、数据结构就是模型Model 根据数据形成的直观的、用户能直接看见的柱形图是视图View 数据构成的表格…

ABAP JSON处理应用

1. json 转换成内表 通过上传URL获取json数据并转换为内表 json to itab关键字 METHOD get_itab_for_json.DATA : lr_client TYPE REF TO if_http_client,lv_url TYPE string,lv_content_type TYPE string VALUE application/x-www-form-urlencoded,ev_xstrin…

【python报错】ModuleNotFoundError: No module named ‘utils‘

问题 想要用python语言将A文件夹的a.py脚本引用utils文件夹b.py脚本&#xff0c;直接引用&#xff1a;from utils import XXX 导致在vscode编译器报错&#xff1a;ModuleNotFoundError: No module named utils 这里文件夹A和utils是同级目录【其他情况&#xff0c;修改后面代码…

背钻设计时要优先保证哪一项,STUB长度真的是越短越好吗

高速先生成员--王辉东 人道是&#xff1a; 八月十八潮&#xff0c;壮观天下无。 鲲鹏水击三千里&#xff0c;组练长驱十万夫。 红旗青盖互明末&#xff0c;黑沙白浪相吞屠。 人生会合古难必&#xff0c;此情此景那两得。 小蝶托着腮望着窗外&#xff0c;思绪飞到千里之外…

【鸿蒙开发从0到1 day08】

鸿蒙开发基础 一.联合类型二.枚举类型三.组件和样式1. ArkUI基本语法 四.尺寸五.字体1.字体颜色2.字体样式3.LineHeight() 设置行高 上间距文字下间距4.下划线:5.对齐方式(1)水平对齐方式(2)垂直对齐方式 6.文本缩进和文本省略号设置 六.图片1.图片的等比例缩放2.占位符3.图片填…

2024腾讯互联网AI应用专场

2024腾讯互联网AI应用专场 灵魂提问&#xff1a; 1、AI应用场景&#xff1a; 智能客服智能数据分析BI 通过AI生成的内容的点击率是人工生产的103%。 2、AI时代已经来临&#xff0c; 依然是这些互联网巨头领导。 现在股价低迷&#xff0c;是不是投资的好机会。 3、agent …

矩阵怪 - 2024全新矩阵产品,一键分发抖音,快手,视频号,B站,小红书!

1. 本方案面向谁&#xff0c;解决了什么问题 本方案主要面向C端客户&#xff0c;特别是那些在各大短视频平台&#xff08;如小红书、抖音、视频号、快手、B站等&#xff09;上进行内容创作和分发的个人用户、自由职业者、小型团队或企业。这些用户通常面临着在多个平台上同时发…