代码随想录第31天|认识贪心算法,455.分发饼干,376. 摆动序列,53.最大子数组和

贪心的介绍

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

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

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

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

再举一个例子如果是有一堆盒子,你有一个背包体积为n,如何把背包尽可能装满,如果还每次选最大的盒子,就不行了。这时候就需要动态规划。因为每次取最大体积的盒子可能导致最终背包有部分位置是空闲的,就无法装满整个背包。

做题的时候,只要想清楚 局部最优 是什么,如果推导出全局最优,其实就够了。

不好意思了,贪心没有套路,说白了就是常识性推导加上举反例

455.分发饼干

455. 分发饼干

首先对数组g和数组s分别进行升序排序,双指针解法分两种情况:

1.饼干1满足胃口1,两个指针都往后移动一格,且count++

2.饼干1太小无法满足胃口1,遍历g数组的指针j后移,试试更大的饼干能不能满足

class Solution {public int findContentChildren(int[] g, int[] s) {Arrays.sort(s);Arrays.sort(g);int count=0;int i=0,j=0;while(i<g.length&&j<s.length){if(s[j]>=g[i]){count++;i++;j++;}else if(s[j]<g[i]){//饼干不能满足当前小孩,试试下一块饼干j++;}}return count;}
}

376. 摆动序列(自己会考虑不周全)

本题要考虑三种情况:

  1. 情况一:上下坡中有平坡
  2. 情况二:数组首尾两端
  3. 情况三:单调坡中有平坡

#情况一:上下坡中有平坡

例如 [1,2,2,2,1]这样的数组,如图:

可以统一规则,删除左边的三个 2:

情况二:数组首尾两端

本题统计峰值的时候,数组最左面和最右面如何统计呢?

在 讨论 情况一:相同数字连续 的时候, prediff = 0 ,curdiff < 0 或者 >0 也记为波谷。

针对以上情形,result 初始为 1(默认最右面有一个峰值),此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)

情况三:单调坡度有平坡

图中,我们可以看出,版本一的代码在三个地方记录峰值,但其实结果因为是 2,因为 单调中的平坡 不能算峰值(即摆动)。

那么我们应该什么时候更新 prediff 呢?

我们只需要在 这个坡度 摆动变化的时候,更新 prediff 就行

代码实现

class Solution {public int wiggleMaxLength(int[] nums) {//仅有一个元素或者含两个不等元素的序列也视作摆动序列。int curDiff=0;//当前的差值int preDiff=0;int res=1;for(int i=0;i<nums.length-1;i++){curDiff=nums[i+1]-nums[i];//出现峰值if((preDiff<=0&&curDiff>0)||(preDiff>=0&&curDiff<0)){res++;preDiff=curDiff;}}return res;}
}

53.最大子数组和

这道题是我第二次做了,现在代码基本可以写得出来,就是有一些细节,边界情况要注意;这一次做也加深对贪心的理解

这里把res初始化成最小负数,而不是0。是因为例如有测试用例:【-2,-1】,在之后sum是为负数的,如果res初始化为0,那么是错误的;

代码实现

class Solution {public int maxSubArray(int[] nums) {if(nums.length==1){return nums[0];}//贪心滑动窗口int sum=0;int res=Integer.MIN_VALUE;//初始化成最小负数,如果for(int i=0;i<nums.length;i++){sum+=nums[i];res=sum>res?sum:res;//注意把这一句放在if条件之前if(sum<=0){sum=0;}//sum重新从当前开始,相当于重置最大子序起始位置,因为遇到负数一定是拉低总和}return res;}
}

如果输入用例都是-1,或者 都是负数,这个贪心算法跑出来的结果是 0, 这是又一次证明脑洞模拟不靠谱的经典案例,建议大家把代码运行一下试一试,就知道了,也会理解 为什么 result 要初始化为最小负数了。如下面我最开始写的代码

class Solution {public int maxSubArray(int[] nums) {//贪心滑动窗口int sum=0;int res=0;for(int i=0;i<nums.length;i++){sum+=nums[i];if(sum<0){sum=0;}res=sum>res?sum:res;}return res;}
}

今天贪心第一天,加油!!

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

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

相关文章

NoSQL数据库介绍+Redis部署

目录 一、NoSQL概述 1、数据的高并发读写 2、海量数据的高效率存储和访问 3、数据库的高扩展和高可用 二、NoSQL的类别 1、键值存储数据库 2、列存储数据库 3、文档型数据库 4、图形化数据库 三、分布式数据库中的CAP原理 1、传统的ACID 1&#xff09;、A--原子性 …

你真会进制的转换吗?进制之间的快速转换方法(我的转换很快,你忍一下)

前言 我们都知道计算机是用 2进制来表示的&#xff0c;也就是一堆的0 1代码组成的逻辑电路&#xff0c;可是当我们窥探内存的时候&#xff0c;计算机给我们显示的总是 16进制的数字&#xff0c;这使得我们作为人类来说&#xff0c;只熟悉 10进制的&#xff0c;阅读这 16进制&a…

Java流处理之转换编码的转换流

之前的博客梳理了基本的字节流和字符流&#xff1a;Java字节流和字符流详解&#xff0c;本文主要讲基于基础的字节字符流做转换编码的转换流。 文章目录 &#x1f926;‍♂️字符编码和字符集&#x1f3c3;字符编码&#x1f3c3;‍♀️字符集 ⛹编码引出的问题&#x1f3cb;In…

C语言【隐式类型转换】和【显式类型转换】的详解

本期介绍&#x1f356; 主要介绍&#xff1a;那些不被轻易发现的类型转换&#xff0c;隐式类型转换和显示类型转换&#x1f440;。 文章目录 一、前言&#x1f356;二、隐式类型转换&#x1f356;2.1 整形提升&#x1f356;2.1.1 例题1&#x1f356;2.1.2 例题2&#x1f356;2.…

基本数据类型的转换 (基础完整篇)

基本数据类型间的转换包括 自动类型转换 和 强制类型转换 ,本文还讲了基本数据类型和String类型间的转换&#xff0c;这些是学习的重点&#xff0c;掌握这些之后还有其他想法或疑问&#xff0c;都可以自己尝试用代码验证结果&#xff0c;总之多实践比死记硬背更有用。&#x1f…

真正的GHOXPGHOST纯净版“觉山孤鹤GHOSTXP纯净版”五一奉献

真正的GHOXPGHOST纯净版“觉山孤鹤GHOSTXP纯净版”五一奉献 描述&#xff1a;一、光盘DOS下启动图 图片&#xff1a; 描述&#xff1a;二、安装效果图 图片&#xff1a; 描述&#xff1a;三、进入桌面 图片&#xff1a; 描述&#xff1a;四、光盘WIN下启动图 图片&#xff1a; …

木蚂蚁软件光盘 V2.0 2008元旦贺岁版

木蚂蚁软件光盘 V2.0 2008元旦贺岁版木蚂蚁软件光盘 V2.0 ★2008元旦贺岁★『木蚂蚁wuhanqi出品--->装机必备』 软件大小&#xff1a;719MB软件类别&#xff1a;国产软件/系统工具软件性质&#xff1a;木蚂蚁wuhanqi特别版 软件授权&#xff1a;免费版 软件语言&#xff1a…

数据结构--队列与循环队列

队列 队列是什么&#xff0c;先联想一下队&#xff0c;排队先来的人排前面先出&#xff0c;后来的人排后面后出&#xff1b;队列的性质也一样&#xff0c;先进队列的数据先出&#xff0c;后进队列的后出&#xff1b;就像图一的样子&#xff1a; 图1 如图1&#xff0c;1号元素是…

【Flutter】Flutter 使用 toggle_switch 实现切换按钮

【Flutter】Flutter 使用 toggle_switch 实现切换按钮 文章目录 一、前言二、安装和基本使用三、Toggle Switch 的基础示例四、Toggle Switch 的高级用法五、实际业务中的完整示例六、总结 一、前言 你好&#xff0c;我是小雨青年&#xff0c;今天我要为大家介绍一个非常实用的…

node.js安装好后测试报错解决

node.js的版本是18.X.X node.js安装好后&#xff0c;执行命令&#xff1a; npm install express -g 报错&#xff01;&#xff01;&#xff01; 解决办法&#xff1a; 看报错是由于权限不够&#xff0c; 所以打开cmd时&#xff0c;以管理员的方式打开 然后再执行命令就OK了…

dataframe更改数据的方法(超级简单易懂!!!)

&#xff1a;&#xff1a;&#xff1a;&#xff1a;插入数据 import pandas as pd import numpy as npdfpd.DataFrame(data[[zs,18,1],[ls,19,1],[ww,17,2]],index[stu0,stu1,stu2],columns[name,age,group]) df 更改单个数据的方法 取出数据后直接赋值&#xff08;一般用不到…

怎样把PDF转换成WORD简单有效

其实文件格式转换的方法大同小异。无非就是选择格式&#xff0c;添加文件&#xff0c;开始转换&#xff0c;但是就这简单的几步&#xff0c;操作不好也会造成转换失败&#xff0c;下面小编以最常见的pdf转换成word格式为例&#xff0c;给大家详细说说pdf转换成word需要注意的地…

如何將人臉變漂亮(一)

利用 mediapipe 進行處理 規劃 1.先把人臉辨識&#xff0c;然後取出框框 2.把框框內的人臉&#xff0c;進行美容 -高反差保留 (1)曝光度調整 (2)綠色與藍色&#xff0c;疊加 (3)YUCIHighPassSkinSmoothingMaskBoost -調整圖像亮度 -混合 3.把人臉的嘴巴&#xff0c;進行塗紅 4.…

pdf转word文档怎么转?看完这篇你就会了

随着数字化时代的到来&#xff0c;电子文档的使用越来越普遍。无论是在学校里撰写论文、在公司里编辑报告&#xff0c;还是在日常生活中收到合同或简历&#xff0c;我们都可能遇到需要将pdf文件转换为word格式的情况。这时&#xff0c;一款高效且易用的pdf转word软件便成为我们…

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生

那种单眼皮小眼睛塌鼻梁厚嘴唇但还挺好看的女生 Data Dance Data Dance大数据采集分析软件&#xff0c;大数据技术经典算法 只有不符合大众审美的人&#xff0c;所以每个人都是美的&#xff01;你们通过这篇文章认识了照片上的我&#xff0c;但如果你们在现实生活中见到我&…

pdf如何转换成word格式最简单

当我们遇到难题的时候&#xff0c;应该积极地寻找方法去解决问题&#xff0c;特别是工作中&#xff0c;只有遇到问题解决问题才能更好的完成工作&#xff0c;拿文件转换问题来说&#xff0c;遇到难转换的文件格式&#xff0c;我们只要积极寻找解决方法还是可以轻松完成转换的。…

pdf怎么转换成word 文档?这几个小妙招别错过

pdf怎么转换成word 文档&#xff1f;想必大家都经常遇到这样的问题&#xff1a;在网上下载了一个 pdf 文件&#xff0c;但是突然需要对其中的文字进行编辑&#xff0c;但是 pdf 文件却不支持直接编辑&#xff0c;这时就需要将 pdf 文件转换成 word 文档&#xff0c;进行编辑。下…

pdf转word文档怎么转?手把手教你转换

随着数字化时代的到来&#xff0c;电子文档在我们的生活和工作中扮演着越来越重要的角色。尤其是pdf格式的文件&#xff0c;由于其可靠性和跨平台的特性&#xff0c;成为了广泛使用的标准文档格式之一。然而&#xff0c;当我们需要对pdf文件进行编辑时&#xff0c;尤其是将其转…

Pandas Dataframe Drop函数的用法

Pandas Dataframe Drop函数的用法 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.drop.html

怎么把照片变年轻?这两个照片变年轻小妙招教给你

怎么把照片变年轻呢&#xff1f;随着年龄的增长&#xff0c;许多人会感到自己不再年轻&#xff0c;失去了曾经的美貌和活力。通过将照片变年轻&#xff0c;你可以重新体验过去的感觉&#xff0c;回忆起年轻时的美好时光&#xff0c;仿佛回到了过去&#xff0c;让我们感受到那段…