【代码随想录训练营第42期 Day27打卡 贪心Part1 - LeetCode 455.分发饼干 376. 摆动序列 53. 最大子序和

news2024/11/17 9:56:00

目录

一、贪心

二、题目与题解

题目一:455.分发饼干 

题目链接

题解:排序+双指针+贪心

题目二:376. 摆动序列

题目链接

题解:贪心

题目三:53. 最大子序和

题目链接

题解1:暴力(失败)

题解2:贪心

三、小结


一、贪心

个人感觉贪心是一个对初学者不太友好的章节,这一类型的题没有固定的做法,更感觉像是凭借做题经验和不断的积累以及个人的思考得来。贪心算法的核心思想是在每一步都采取当前状态下最优的选择,而不考虑未来可能产生的影响。虽然贪心算法不能保证总是得到最优解,但在很多情况下,它可以获得很好的结果。

由于贪心更侧重于对于不同的题的变通,这里直接开始今天的题,从题中去感受贪心的思想。

二、题目与题解

题目一:455.分发饼干 

题目链接

455. 分发饼干 - 力扣(LeetCode)

假设你是一位很棒的家长,想要给你的孩子们一些小饼干。但是,每个孩子最多只能给一块饼干。

对每个孩子 i,都有一个胃口值 g[i],这是能让孩子们满足胃口的饼干的最小尺寸;并且每块饼干 j,都有一个尺寸 s[j] 。如果 s[j] >= g[i],我们可以将这个饼干 j 分配给孩子 i ,这个孩子会得到满足。你的目标是尽可能满足越多数量的孩子,并输出这个最大数值。

 

示例 1:

输入: g = [1,2,3], s = [1,1]
输出: 1
解释: 
你有三个孩子和两块小饼干,3个孩子的胃口值分别是:1,2,3。
虽然你有两块小饼干,由于他们的尺寸都是1,你只能让胃口值是1的孩子满足。
所以你应该输出1。

示例 2:

输入: g = [1,2], s = [1,2,3]
输出: 2
解释: 
你有两个孩子和三块小饼干,2个孩子的胃口值分别是1,2。
你拥有的饼干数量和尺寸都足以让所有孩子满足。
所以你应该输出2.

提示:

  • 1 <= g.length <= 3 * 104
  • 0 <= s.length <= 3 * 104
  • 1 <= g[i], s[j] <= 231 - 1
题解:排序+双指针+贪心

这道题相对来说还是比较简单的。

首先就是得先对两个数组排序--为什么要排序呢?因为题目要求我们尽可能满足多的孩子,那么就肯定是小饼干配胃口小的小孩,大饼干配胃口大的小孩,排序之后,我们就可以通过循环遍历来实现这个问题。

思路一:尽可能先配给胃口小的孩子小的饼干

采用双指针i,j分别从两个数组起始位置开始遍历,如果满足饼干大小大于胃口,两个指针同时后移;如果饼干大小小于胃口,就只将指向饼干的j指针后移,实现从小到大为小孩配饼干。

 思路二:尽可能先配给胃口大的孩子大的饼干(其实和思路一差不多,只是顺序不同)

class Solution {
public:
    int findContentChildren(vector<int>& g, vector<int>& s) {
        int ans = 0;
        sort(g.begin(), g.end());       //先排序
        sort(s.begin(), s.end());
        int j = s.size() - 1;        //遍历饼干的指针j       
        for (int i = g.size() - 1; i >= 0; i--) {           //遍历胃口的指针i:从大到小遍历(i--)
            if (j >= 0 && s[j] >= g[i]) {           //遍历饼干:当存在满足当前胃口饼干时
                ans++;
                j--;            //j指针左移
            }
        }
        return ans;
    }
};

题目二:376. 摆动序列

题目链接

376. 摆动序列 - 力扣(LeetCode)

如果连续数字之间的差严格地在正数和负数之间交替,则数字序列称为 摆动序列 。第一个差(如果存在的话)可能是正数或负数。仅有一个元素或者含两个不等元素的序列也视作摆动序列。

  • 例如, [1, 7, 4, 9, 2, 5] 是一个 摆动序列 ,因为差值 (6, -3, 5, -7, 3) 是正负交替出现的。

  • 相反,[1, 4, 7, 2, 5] 和 [1, 7, 4, 5, 5] 不是摆动序列,第一个序列是因为它的前两个差值都是正数,第二个序列是因为它的最后一个差值为零。

子序列 可以通过从原始序列中删除一些(也可以不删除)元素来获得,剩下的元素保持其原始顺序。

给你一个整数数组 nums ,返回 nums 中作为 摆动序列 的 最长子序列的长度 。

示例 1:

输入:nums = [1,7,4,9,2,5]
输出:6
解释:整个序列均为摆动序列,各元素之间的差值为 (6, -3, 5, -7, 3) 。

示例 2:

输入:nums = [1,17,5,10,13,15,10,5,16,8]
输出:7
解释:这个序列包含几个长度为 7 摆动序列。
其中一个是 [1, 17, 10, 13, 10, 16, 8] ,各元素之间的差值为 (16, -7, 3, -3, 6, -8) 。

示例 3:

输入:nums = [1,2,3,4,5,6,7,8,9]
输出:2

提示:

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
题解:贪心

个人感觉这道题第一次接触的话,还是挺有难度的。

这里考察到了摆动序列,我们可以将每一个元素的的下标作为横坐标,值作为纵坐标大致画在图上,那么就会得到一个波形图,其中每次出现的摆动都是一个峰值(类似于波峰或者波谷),我们需要得到的摆动序列的长度其实就是峰值数+1。(由于默认序列至少一个元素,所有我们初始化摆动序列长度为1)

然后这道题的重点就变成了如何实现找到峰值的数目(峰值数)。我们定义两个变量:一个表示当前一对元素的差值,一个表示前一对元素的差值,通过判断两差值是否异号,实现对峰值部分的判断。

这个题还有一个关键的点就是对于平坡的处理:需要注意的是,遇到平坡,表示前一对元素的差值不变,因为平坡不在序列长度的考虑部分。

class Solution {
public:
    int wiggleMaxLength(vector<int>& nums) {
        int n = nums.size();
        if (n <= 1) {           //仅有一个元素时直接返回即可
            return n;
        }
        int curDiff = 0;            //当前一对差值(后一个元素和当前元素):nums[i + 1] - nums[i]
        int preDiff = 0;            //前一对差值,用于和当前一对差值比较以检测是否发生摆动
        int ans = 1;                 //表示摆动序列长度,由于默认序列至少一个元素,初始化为1,摆动序列长度 = 峰值数 + 1
        for (int i = 0; i < n - 1; i++) {
            curDiff = nums[i + 1] - nums[i];
            if ((preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)) {    //如果发生了摆动:出现了峰值(波峰或波谷)    
                ans++;
                preDiff = curDiff;          //注意这里,只在摆动变化的时候更新prediff:这样就能考虑到平坡的情况-->出现平坡时,不改变前一对差值
            }
        }
        return ans;
    }
};

题目三:53. 最大子序和

题目链接

53. 最大子数组和 - 力扣(LeetCode)

给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

子数组

是数组中的一个连续部分。

示例 1:

输入:nums = [-2,1,-3,4,-1,2,1,-5,4]
输出:6
解释:连续子数组 [4,-1,2,1] 的和最大,为 6 。

示例 2:

输入:nums = [1]
输出:1

示例 3:

输入:nums = [5,4,-1,7,8]
输出:23

提示:

  • 1 <= nums.length <= 105
  • -104 <= nums[i] <= 104
题解1:暴力(失败)

先看看暴力解法(未能通过全部案例):

暴力解法的思路很简单,这里就不做过多解释,毕竟是个失败的做法。

题解2:贪心

这个题其实我感觉贪心用的还是比较巧妙,就是当你前面所有元素之和为负数的时候,就可以直接跳过,从下一个元素重新开始寻找新的子序列。(但是这个时候你必须要记录下前面那些元素所拥有的最大子序和和后面新开的子序列做比较);当然如果没有存在前面元素和为负数情况的话,就只需要不断遍历比较得出最大值即可。

代码如下:

class Solution {
public:
    int maxSubArray(vector<int> &nums) {
        int ans = INT_MIN;       //类似寻找最大最小值的题目,初始值一定要定义成理论上的最小最大值
        int n = nums.size();
        int sum = 0;            //记录当前子数组元素的和
        for (int i = 0; i < n; i++) {
            sum += nums[i];         //不断添加元素,改变当前子数组的和(每次添加完元素求和都与原最大值比较并判断是否小于0)
            ans = max(ans, sum);        //不断更新结果:取较大值
            if (sum < 0) {       //关键:前面元素求和为负数,直接跳过从下一个元素重新开始记录新的子数组(加上负数肯定变小)
                sum = 0;
            }
        }
        return ans;
    }
};

三、小结

贪心还是得多做题,很多东西是不好描述出来的,只有通过不断做题看代码才能慢慢感到有收获。

最后,我是算法小白,但也希望终有所获。

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

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

相关文章

解决生产环境服务启动失败:一次远程Bug排查与修复历程

一、问题现象 同事没事一直给服务器断电&#xff08;直接拔插头那种&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 二、初步排查 首先&#xff0c;我登录到生产服务器&#xff0c;查看服务启动日志。在日志中&#xff0c;我发现了一些异常信息&#xff0c;…

全网独家梳理:数字病理图像的常用存储格式以及格式转换的方法|24-08-17

小罗碎碎念 这一期推文&#xff0c;跟你们分享一些比较底层&#xff0c;并且顶刊中不会涉及但是又至关重要的内容。 我们在做任何一个病理AI的项目前&#xff0c;有两样东西是一定会拿到手的——切片&对应的临床基线表。&#xff08;如果做多组学/多模态的项目&#xff0c;…

宠物空气净化器推荐购买吗?真的能除毛去味吗?

自从做了猫咖店老板&#xff0c;我这生活真的是美滋滋&#xff0c;每天都可以摸到不同品种的可爱的小猫咪&#xff0c;在赚钱养家的同时还能肆意和猫咪贴贴&#xff0c;连朋友都说想和我干一样的工作了。每天接待的顾客也不少&#xff0c;店里面的空气质量也还不错&#xff0c;…

模块一(任务2):SDH系统原理解读

一、PDH与SDH标准速率介绍 OTN网络技术是基于SDH系统和WDM系统设计的&#xff0c;所以学习OTN系统原理必须要掌握SDH和WDM量大系统原理 1、PDH与SDH概念及特点 二、SDH的帧结构 目前通信常见的数据结构有两种&#xff1a; 报文&#xff1a;基于以太网通信的数据结构 帧&am…

真诚巨作:全文一万字教你快速熟悉项目|文心快码帮你快速熟悉~

写在前面 : 上了好多年的学&#xff0c;终于毕业进入职场啦&#xff5e;在公司也有一段时间了&#xff0c;慢慢地也变成了纯正的社畜了。近来开始熟悉部门的项目代码&#xff0c;说实话公司的代码真跟以前接触的不一样&#xff0c;内部各种自建框架&#xff0c;让人看得眼花缭乱…

ARCGIS PRO 要素标注背景色透明度的设置

使用ArcGIS Pro 设置标注背景色的透明度 一、点击标注属性 二、点击符号、注释 三、下拉框选择背景 四、背景符号 五、点击颜色 六、编辑颜色 七、应用

Java语言程序设计基础篇_编程练习题**16.26(模拟:升旗并播放国歌)

目录 题目&#xff1a;**16.26&#xff08;模拟&#xff1a;升旗并播放国歌&#xff09; 习题思路&#xff1a; 代码示例 结果展示 音频来源 题目&#xff1a;**16.26&#xff08;模拟&#xff1a;升旗并播放国歌&#xff09; 创建一个显示升国旗的程序&#xff0c;如图15-14…

还在使用百度翻译?这4款翻译工具也能帮你打破语言壁垒!

是谁像我一样&#xff0c;一提到翻译工具第一想到的就是百度翻译。它可以是用了好久的翻译工具&#xff0c;可是随着学习的深入&#xff0c; 我还是发觉了一些其他的实用翻译工具。比如下面这四款&#xff1a; 1、365翻译工具 直达链接&#xff1a;https://fanyi.pdf365.cn/ …

NLP之transformer:transformer-explainer的简介、安装和使用方法、案例应用之详细攻略

NLP之transformer&#xff1a;transformer-explainer的简介、安装和使用方法、案例应用之详细攻略 目录 相关论文 《Transformer Explainer: Interactive Learning of Text-Generative Models》翻译与解读 transformer-explainer的简介 transformer-explainer的安装和使用方…

尚硅谷MYSQL(12-13章)

第十二章数据类型 比如说tinyint&#xff08;4&#xff09;这个四表示的是那个取值范围的位数 他只是一个显示 比如说int后面应该是int&#xff08;11&#xff09;这是有符号的 无符号int是int&#xff08;10&#xff09; 如果写成int&#xff08;3&#xff09;但是存的数据是…

论文写作新神器!10款可以写论文的人工智能软件

在当今快速发展的数字时代&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到各个领域&#xff0c;包括学术研究和论文写作。为了帮助学者和学生提高写作效率和质量&#xff0c;市场上涌现了许多优秀的AI写作工具。本文将详细介绍10款可以写论文的人工智能软件&…

STM32F103C8T6单片机原理图设计(PCB板)

先了解了以下stm32f103c8t6的引脚使用&#xff1a; 对比过一些原理图&#xff0c;我发现除了特定协议的引脚功能&#xff0c;只要功能正确&#xff0c;可以自己选择连接对应的引脚。可以根据使用的LED/BEEP/DHT11/BH1750/ESP8266等模块的功能对应相应的引脚&#xff1a; WIFI(…

[开源] 安卓系统发送modbus协议到硬件设备下位机

最近是在研究安卓板子上的modbus通信&#xff0c;于是写了这个maven依赖。 项目中主要用到的功能是读写寄存器&#xff0c;所以依赖中重点测试了读写多个寄存器的协议。 另外你可以自定义协议pdu交给程序进行封装及发送。 如果使用中发现了什么问题&#xff0c;可以到仓库添…

DHU OJ 循环结构 整除的尾数

思路及代码 //input T int >0 //input a,b int 0< <10000 10< <100 #include<iostream> #include<iomanip> using namespace std; int main(){int T;cin >> T;while (--T > 0){int a, b;cin >> a >> b; //solution // (a*100…

Tomcat初篇

目录 Tomcat主要特点Tomcat的核心组件Tomcat使用安装Tomcat配置Tomcat启动和停止Tomcat Tomcat工作原理目录结构配置文件性能优化策略 Tomcat Apache Tomcat是一个开源的Servlet容器和Web服务器&#xff0c;广泛用于运行基于Java的Web应用程序。它实现了Java Servlet和JavaSer…

【Web开发手礼】探索Web开发的秘密(十八)-Vue2(4)部门管理页面、路由、打包部署

主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 文章目录 前言 部门管理页面 Vue路由 打包部署 打包 部署 总结 前言 主要介绍了部门管理页面、路由、打包部署&#xff01;&#xff01;&#xff01; 部门管理页面 <template><div>&…

module ‘pkgutil‘ has no attribute ‘ImpImporter‘. Did you mean_ ‘zipimporter‘_

错误详情&#xff1a; Traceback (most recent call last):File "<frozen runpy>", line 198, in _run_module_as_mainFile "<frozen runpy>", line 88, in _run_codeFile "C:\ProgramData\anaconda3\envs\py312\Scripts\mim.exe\__main…

数值计算引擎:搭建远程容器开发环境

Build VS Code Remote Docker Development Environment 大型CAE软件开发技术栈通常依赖多个第三方库&#xff0c;因此从零开始配置开发、编译、运行等环境通常较为繁琐。但随着公司的发展壮大&#xff0c;却经常需要为新加入的成员配备相应的开发环境&#xff1b;另外&#xf…

深入理解 go unsafe

往期精选文章推荐&#xff1a; 深入理解 go mapgo 常用关键字深入理解 Go 数组、切片、字符串深入理解channel深入理解 go context深入 go interface 底层原理深入理解 go reflect深入理解 go unsafe 为什么有go unsafe Go 是支持指针的语言&#xff0c;但是为了保持简洁、安…

HW高耗电提醒竞品调研

摘要 高耗电提醒通知的规则,天生存在打扰用户的特点,故在触发高耗电检测阈值还要根据是否非可感知场景,进一步修正高耗电提醒的准确率。同时消息通知的交互设计中也进行少打扰静默设计 一、功耗高耗电通知监控规则 1.1 高耗电上报规则和文案 支持的耗电类型 上报高耗电通…