代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和
代码随想录刷题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此时就有波动就需要统计。 -
本题要考虑三种情况:
-
情况一:上下坡中有平坡

-
情况二:数组首尾两端
-
针对序列[2,5],可以假设为[2,2,5],这样它就有坡度了即 preDiff = 0,result 初始为 1(默认最右面有一个峰值)

-
-
情况三:单调坡中有平坡

- 我们应该什么时候更新 prediff 呢?
- 我们只需要在 这个坡度 摆动变化的时候,更新 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;} } -
总结:
- 遇到连续和为负数才更新起始位置。并不是遇到负数就更新。
相关文章:
代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和
代码随想录刷题day27丨455.分发饼干 ,376. 摆动序列 ,53. 最大子序和 1.贪心算法理论基础 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 这么说有点抽象,来举一个例子: 例如,有一堆钞票,你可以拿走十张&a…...
Detect It Easy
Detect It Easy(简称 DIE)项目的网址为 https://github.com/horsicq/Detect-It-Easy 下载完安装包后,直接双击die.exe即可进入到操作界面 工具介绍: 它可以用来检测程序架构和文件类型。如图所示。其中,「模式」说明程…...
c++开关灯
题目描述 现有 𝑛n 盏灯排成一排,从左到右依次编号为:11,22,……,𝑛n。然后依次执行 𝑚m 项操作。 操作分为两种: 指定一个区间 [𝑎,𝑏][a,b]&…...
DevOps实现CI/CD实战(六)- Jenkins集成k8s
十、 Jenkins集成k8s Jenkins在集成K8s之前,需要搭建k8s集群,具体搭建步骤,完整笔记 https://github.com/ITenderL/ITenderL.github.io/tree/main/docs/DevOps, 包括完整的DevOps的笔记。 1. 准备部署的yml文件 pipeline.yml …...
张雪峰:物联网行业迎高光时刻!如何选择?我们诚聘销售工程师!
作为一间10多年的物联网公司,各位求职人士可以看看我们其中一个招聘要求,和自己需求结合分析分析,希望对你们有所帮助。 【公司实力底蕴】 盈电智控物联网科技(广东)有限公司,2024年7月成立,是…...
利用多文件编程实现顺序表的创建,判满,插入,输出
文章目录 🍊自我介绍🍊利用多文件编程实现顺序表的创建,判满,插入,输出seqlist.cseqlist.hmain.c 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞关注评论收藏(一键四连ÿ…...
百度快照劫持之JS劫持诊断与恢复一例
劫持现象: 百度搜索结果中,被劫持网站出现在搜索结果中, 点击进入网站,网站显示正常,数秒后网站自动跳转到彩票网站f51688.com/ff6/。但是第二次点击搜索结果,正常进入网站缺不会跳转到彩票网站。 初步认…...
深入探讨Go语言中的切片与数组操作
在编程世界中,数组一直是非常流行的数据结构,主要有两个原因:其一是简单易懂,其二是非常灵活,可以存储多种不同类型的数据。在Go语言中,数组的用法有其独特的特点,但与此同时,Go语言…...
【WPS Excel】复制表格时,提示“图片太大,超过部份将被截去“ 问题
WPS表格 2019版本 升级到 WPS最新版 WPS-支持多人在线协作编辑Word、Excel和PPT文档_WPS官方网站 使用最新版就能够解决这个问题,如果仍旧无法解决可以勾选如下配置 重启Excel解决。 请勾选:文件 - 选项 - 编辑 - 不提示且不压缩文件中的图像...
驱动(RK3588S)第九课时:多节点驱动与函数接口
目录 一、多节点概念1、所用到的结构体说明2、函数接口主要是read和write函数2.1、把应用层的数据拷贝给底层2.2、把应用层的数据拷贝给底层 3、应用层的read和write函数4、底层的read和write函数二、ioctl控制命令接口1、概念2、函数介绍应用层和驱动层 三、代码与现象1.编写L…...
Linux系统下配置MySQL
1. 寻找MySQL的配置文件 MySQL的配置文件通常位于以下位置: 在大多数Linux系统上,主配置文件通常位于/etc/mysql/my.cnf或/etc/my.cnf。在macOS上,如果你使用Homebrew安装MySQL,配置文件通常位于/usr/local/etc/my.cnf。在Window…...
信捷 XD PLC POU编程之FB
在使用信捷的POU方式编程,可以建立两种POU:FB和FC。 FB和FC这两种POU又各自可以建立梯形图语言POU和C语言POU。 函数块(FB)是把反复使用的部分程序块转换成一种通用部件,他可以在程序中反复被调用,不仅 提高了程序的开…...
终于有人把云计算、大数据和人工智能讲明白了!
引言 在当今数字化时代,云计算、大数据和人工智能成为了全球科技界的热门话题。这些技术的迅猛发展以及应用范围的不断扩大,正深刻地改变着我们的生活和工作方式。云计算为我们提供了有效的计算和存储能力,大数据则以海量的信息资源为基础&a…...
【编程底层思考】详解Java内存模型(JMM)原理及其作用
Java内存模型(Java Memory Model, JMM)是Java虚拟机(JVM)的一个核心概念,它定义了Java程序中各种变量(线程共享变量)的访问规则,以及在并发环境下,为了确保数据的可见性、…...
Docker的基本概念和优势
Docker是一个开源的容器化平台,它可以将应用程序及其所有依赖项和运行环境打包到一个称为容器的独立单元中。容器化使得应用程序在不同的环境中可以以相同的方式运行,并且更加轻量级和可移植。 Docker的基本概念包括以下几点: 镜像…...
数据结构————内核链表
内核链表是Linux内核中广泛使用的一种数据结构,它具有以下特点: 1.双向循环链表:每个节点包含两个指针,一个指向前驱节点(prev),另一个指向后继节点(next),…...
使用API接口获取某宝商品数据详情
什么是淘宝API接口? 淘宝API接口是淘宝开放平台为开发者提供的一种应用程序接口。它允许开发者通过编程方式,安全、高效地与淘宝平台进行数据交互,从而获取商品详细信息、用户信息、订单信息等多种数据。这些接口不仅简化了数据获取流程&…...
用Python实现时间序列模型实战——Day 15: 时间序列模型的选择与组合
一、学习内容 1. 模型选择的标准与方法(如 AIC、BIC) 在时间序列建模中,模型的选择是非常重要的,常用的模型选择标准包括 AIC (Akaike Information Criterion) 和 BIC (Bayesian Information Criterion)。 AIC (Akaike Informat…...
大数据之Flink(五)
15、Flink SQL 15.1、sql-client准备 启用Hadoop集群(在Hadoop100上) start-all.sh启用yarn-session模式 /export/soft/flink-1.13.0/bin/yarn-session.sh -d启动sql-client bin/sql-client.sh embedded -s yarn-sessionsql文件初始化 可以初始化模式、环境(流/批…...
SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析
查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但…...
关于nvm与node.js
1 安装nvm 安装过程中手动修改 nvm的安装路径, 以及修改 通过nvm安装node后正在使用的node的存放目录【这句话可能难以理解,但接着往下看你就了然了】 2 修改nvm中settings.txt文件配置 nvm安装成功后,通常在该文件中会出现以下配置&…...
Java多线程实现之Callable接口深度解析
Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...
C++ 基础特性深度解析
目录 引言 一、命名空间(namespace) C 中的命名空间 与 C 语言的对比 二、缺省参数 C 中的缺省参数 与 C 语言的对比 三、引用(reference) C 中的引用 与 C 语言的对比 四、inline(内联函数…...
【决胜公务员考试】求职OMG——见面课测验1
2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
接口自动化测试:HttpRunner基础
相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具,支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议,涵盖接口测试、性能测试、数字体验监测等测试类型…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
负载均衡器》》LVS、Nginx、HAproxy 区别
虚拟主机 先4,后7...
