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

24暑假算法刷题 | Day27 | 贪心算法 I | LeetCode 455. 分发饼干,376. 摆动序列,53. 最大子数组和

目录

  • 455. 分发饼干
    • 题目描述
    • 题解
  • 376. 摆动序列
    • 题目描述
    • 题解
  • 53. 最大子数组和
    • 题目描述
    • 题解


455. 分发饼干

点此跳转题目链接

题目描述

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

对每个孩子 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

题解

贪心算法入门题目,贪心思路为: 优先用较小的饼干满足较小胃口的孩子 。这应该也是相当符合直觉的思路了!

class Solution
{
public:int findContentChildren(vector<int> &g, vector<int> &s){// 贪心算法:能满足就先满足// 先将胃口数组和尺寸数组都先从小到大排序sort(g.begin(), g.end());sort(s.begin(), s.end());int child = 0, cookie = 0;while (child < g.size() && cookie < s.size()) {if (s[cookie] >= g[child]) // 每次尝试满足当前胃口最小的孩子cookie++, child++;else // 满足不了,就换下一块饼干cookie++;}return child;}
};

376. 摆动序列

点此跳转题目链接

题目描述

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

  • 例如, [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

进阶: 你能否用 O(n) 时间复杂度完成此题?

题解

贪心算法解决。注意到题目中说的子序列实际上 不是连续的 ,所以我们完全可以在一次遍历(达到进阶要求的 O ( n ) O(n) O(n) 时间复杂度)中, “跳过” 那些 没有“摆动” 的部分,相当于只统计数组中的 极大值和极小值 数量即可。

⚠️ 是“极值”(局部)而不是“最值”(整体)

代码随想录 将其描述为统计“局部峰值”(包括高峰和低谷),也很直观:

在这里插入图片描述

代码(C++)

class Solution
{
public:int wiggleMaxLength(vector<int> &nums){// 仅有一个元素或者含两个不等元素的序列也视作摆动序列if (nums.size() == 1)return 1;if (nums.size() == 2)return nums[0] == nums[1] ? 1 : 2;// 贪心算法int prevDiff = nums[1] - nums[0];     // 前两个数的差值int curDiff;                          // 当前两个数的差值int len = nums[0] == nums[1] ? 1 : 2; // 摆动子序列的长度for (int i = 2; i < nums.size(); ++i){curDiff = nums[i] - nums[i - 1];if (curDiff * prevDiff < 0 || (prevDiff == 0 && curDiff != 0)){prevDiff = curDiff; // 只在“摆动”时才更新prevDifflen++;}}return len;}
};

📍 有几处细节需要注意:

1️⃣ 循环中,只需要在发生了“摆动”时才更新 prevDiff ,否则遇到连续的相同数字组成的“平坡”会被干扰(差值总是为0)

2️⃣ curDiff * prevDiff < 0 的含义:两个差值“一正一负”,发生摆动

3️⃣ prevDiff == 0 && curDiff != 0 的含义:特殊情况——数组起始就有一个平坡,例如 3, 3, 3, 2, 5 ,此时开头的 3, 3, 3 也相当于一个极值,需要记录。可以看到,除此之外,prevDiff 总是不为0的(因为除了一开始, prevDiff 都是由 curDiff 更新来的,而前一个条件判断确保了更新时 curDiff 不为0)。


53. 最大子数组和

点此跳转题目链接

题目描述

给你一个整数数组 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

进阶: 如果你已经实现复杂度为 O(n) 的解法,尝试使用更为精妙的 分治法 求解。

题解

经典的贪心算法。在遍历过程中,如果当前子数组之和为 负数 ,那么再往里面添加下一个数字,相当于减小了下一个数字。所以此时,我们可以贪心地直接将前面这个和为负子数组“累赘”丢掉:

int maxSubArray(vector<int> &nums)
{// 贪心算法int curSum = 0, maxSum = INT_MIN;for (int i = 0; i < nums.size(); ++i) {curSum += nums[i];maxSum = max(curSum, maxSum);if (curSum < 0) // 当前子数组和为负,就是个“累赘”,丢掉curSum = 0; }return maxSum;
}

也可以进一步简化,更优雅:

int maxSubArray(vector<int> &nums)
{int curSum = nums[0], maxSum = curSum;for (int i = 1; i < nums.size(); ++i) {curSum = max(curSum + nums[i], nums[i]);maxSum = max(curSum, maxSum);}return maxSum;
}

相关文章:

24暑假算法刷题 | Day27 | 贪心算法 I | LeetCode 455. 分发饼干,376. 摆动序列,53. 最大子数组和

目录 455. 分发饼干题目描述题解 376. 摆动序列题目描述题解 53. 最大子数组和题目描述题解 455. 分发饼干 点此跳转题目链接 题目描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#x…...

Golang 的空接口有什么用?

空接口在 Go 语言中具有多种重要用途&#xff1a; 实现通用的数据结构 例如&#xff0c;可以创建一个包含空接口类型元素的切片或映射&#xff0c;从而能够存储不同类型的值。这在处理多种未知类型的数据时非常有用。比如&#xff0c;一个日志系统可能会将不同类型的日志消息&a…...

计算机毕业设计选题推荐-课程教学平台-Java/Python项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…...

健身日记之倒立俯卧撑学习——起始日2024.6.4

文章目录 目录 前言上期预期 昔日计划 新目标计划 瓶颈突破尝试 参考视频及文章 前言 两个月过去了&#xff0c;已经有所突破了&#xff0c;但是比较预期还是有较大差距&#xff0c;忘记更新csdn了&#xff0c;平时抖音视频号记录的多一些。 上期预期 2024.6.4开始尝试突…...

pikachu文件包含漏洞

一&#xff1a;漏洞基础 程序在引用文件的时&#xff0c;引用的文件名存在可控的情况&#xff0c;传入的文件名没有经过合理的校验或校验不严&#xff0c;从而操作了预想之外的文件&#xff0c;就有可能导致文件泄漏和恶意的代码注入&#xff1b; 文件包含漏洞概念 在PHP程序…...

09.FreeRTOS时间片调度与任务相关函数

文章目录 09. FreeRTOS时间片调度与任务相关函数1. FreeRTOS时间片调度2. 任务状态查询API函数3. 任务时间统计API函数 09. FreeRTOS时间片调度与任务相关函数 1. FreeRTOS时间片调度 时间片调度简介&#xff1a; 时间片调度实验流程&#xff1a; 核心代码&#xff1a; 开…...

git分支介绍

git branch 查看当前分支情况 可以看见当前只有一个分支叫main&#xff0c;也就是默认分支&#xff0c;可以理解为树的主干&#xff0c;git早期版本中默认分支叫master 命令行创建一个新分支 git branch [分支名]在创建之后&#xff0c;如果需要切换到新分支需要git switc…...

vm虚拟机下安装CentOS7系统

VMware16安装CentOS7 1.启动之前安装的VM 具体VMware安装过程 2.配置Linux&#xff08;centos7&#xff09;的镜像文件 选择安装镜像文件 4.开启虚拟机 开始读秒安装 选择安装过程中使用的语言&#xff0c;这里选择英文、键盘选择美式键盘。点击Continue 首先设置时间…...

python-报数(赛氪OJ)

[题目描述] 有 n 人围成一圈&#xff0c;顺序排号。 从第 1 个人开始报数&#xff08;从 1 到 3 报数&#xff09;&#xff0c;凡是报到 3 的人退出圈子&#xff0c;问最后留下的是原来的第几号的那位。输入格式&#xff1a; 初始人数 n 。输出格式&#xff1a; 最后一人的初始…...

灵办AI:智能插件,办公与编程的得力助手

目录 引言一、灵办AI&#xff1a;智能化的办公伙伴二、编程能力&#xff1a;&#x1f525;代码阅读&#xff0c;学习助手&#x1f525;1、代码解读2、代码续写3、代码优化 三、插件端对话功能&#xff1a;智能交互&#xff0c;流畅体验四、翻译功能&#xff1a;一键翻译&#x…...

食家巷小程序:传统面点与平凉特产的美味盛宴

在美食的世界里&#xff0c;总有一些角落等待着我们去探索&#xff0c;而食家巷小程序就是这样一个为您开启美食宝藏的钥匙。 一、传统面点&#xff0c;传承千年的美味 食家巷小程序为您呈现了种类丰富的传统面点&#xff0c;每一款都蕴含着深厚的历史和文化底蕴。 平凉锅盔&…...

矢量文件坐标转换:2000坐标系转换为wgs84坐标系,具体代码实现

最近在处理矢量样本的时候&#xff0c;遇到一些shp文件的坐标系为2000坐标&#xff0c;需要统一地把非WGS84坐标系的矢量转换为WGS84坐标系。 本文记录一下如何进行2000坐标系转化为wgs84坐标系的过程。 在处理矢量数据转换的过程中&#xff0c;有几个关键步骤确保了数据的有效…...

MySQL-InnoDB引擎

目录 逻辑存储结构 架构 概述 内存结构 Buffer Pool&#xff08;缓冲池&#xff09; Change Buffer&#xff08;更改缓冲区&#xff09; Adaptive Hash Index&#xff08;自适应hash索引&#xff09; Log Buffer&#xff08;日志缓冲区&#xff09; 磁盘结构 System T…...

【Material-UI】复杂按钮 (Complex Button) 自定义详解

文章目录 一、ButtonBase 组件简介二、实例讲解&#xff1a;创建复杂的图片按钮1. 样式定义2. 核心组件构建3. 交互效果 三、高级自定义技巧1. 响应式设计2. 动态内容与动画 四、总结 在现代 Web 应用中&#xff0c;按钮不仅仅是一个点击交互元素&#xff0c;它们也承载着传递信…...

IT服务质量管理攻略(至简)

质量管理、风险管理和信息安全管理是IT服务监督管理的重要内容&#xff0c;三者之间相对独立。IT服务质量管理是通过制订质量方针、质量目标和质量计划&#xff0c;实施质量控制、质量保证和质量改进活动&#xff0c;确保IT服务满足服务级别协议的要求&#xff0c;最终获得用户…...

MySQL事务隔离级别、InnoDB使用MVCC+各种锁实现了RC和RR事务隔离级别、具体案例

事务隔离级别 脏读&#xff1a;一个事务读取到另一个未提交事务的更改。不可重复读&#xff1a;一个事务在两次读取同一数据时&#xff0c;发现数据被另一个已提交事务修改了。幻读&#xff1a;一个事务在读取过程中&#xff0c;因其他事务的插入而导致返回的行数不一致&#…...

你的Java项目还在等待吗?快来学会线程池,解放你的性能!

文章目录 你的Java项目还在等待吗&#xff1f;快来学会线程池&#xff0c;解放你的性能&#xff01;1 什么是线程池&#xff1f;为什么需要它&#xff1f;2 线程池的参数有哪些&#xff1f;3 不同类型的线程池有哪些配置&#xff1f; 你的Java项目还在等待吗&#xff1f;快来学…...

深入解析:Amazon Bedrock 上 Claude 3 Haiku 的微调测试报告

前言 2024年7月10日&#xff0c;Anthropic Claude 3 Haiku 的微调功能在 Amazon Bedrock 上开放预览。本篇文章将分享 Claude 3 Haiku 的微调使用步骤及微调后模型的评估结果。 LLM 细调的优势 通过细调&#xff0c;LLM可以获得特定领域的知识或新知识。这样&#xff0c;与RA…...

2023年庐阳区青少年信息学科普日真题- 马拉松(marathon)

题目描述 环湖马拉松全程 L 公里&#xff0c;已经安排了 N 个补给点&#xff0c;位置已经确定。由于预算增加&#xff0c;现在可以增设 K 个补给点。如何安排新增的补给点使得相邻补给点间最大距离最小。相邻补给点间距离也包括起点与第一个补给点之间的距离和最后一个补给点与…...

Python笔记:socket.gaierror: [Errno -3] Temporary failure in name resolution

【Python】成功解决socket.gaierror: [Errno -3] Temporary failure in name resolution 在Python开发中&#xff0c;使用网络编程时&#xff0c;特别是处理socket连接时&#xff0c;遇到socket.gaierror: [Errno -3] Temporary failure in name resolution这个错误是一个相对…...

编译期计算失效?内存布局异常?constexpr调试全链路指南,一线工程师紧急避坑手册

第一章&#xff1a;编译期计算失效&#xff1f;内存布局异常&#xff1f;constexpr调试全链路指南&#xff0c;一线工程师紧急避坑手册识别 constexpr 实际求值时机的三步验证法 当 constexpr 函数在运行时才执行&#xff08;而非编译期&#xff09;&#xff0c;往往因隐式类型…...

空间多组学三大算法实战:从cell2location定位到Hotspot富集,一站式解析组织微环境

1. 空间多组学分析工作流概览 空间多组学技术正在彻底改变我们对组织微环境的理解方式。想象一下&#xff0c;你手里同时握有单细胞转录组数据和空间转录组数据&#xff0c;就像同时拥有了食材清单和菜谱&#xff0c;但如何把这些原材料变成一道美味佳肴&#xff1f;这就是我们…...

VSG阻抗扫描实战:从建模仿真到扫频验证

VSG 扫频法 阻抗扫描 阻抗建模验证 正负序阻抗 持续 更新 迭代 新能源 变流器 逆变器 虚拟同步控制 VSG 复现 基于序阻抗的虚拟同步机同步频率谐振现象 可设置扫描范围、扫描点数 程序附带注释&#xff0c;每一行都能看懂 包括 vsg仿真模型&#xff0c;阻抗建模程序&#xff0…...

python twilio

# 关于Twilio与Python&#xff0c;一些实践后的思考 最近在项目中频繁使用Twilio来处理通信需求&#xff0c;发现不少开发者对这个工具集的理解还停留在“发短信的API”层面。实际上它的能力远不止于此&#xff0c;也并非简单地调用几个接口那么简单。 它究竟是什么 Twilio本…...

【Scratch×AI 系列 07】流程使用(下):从 planX 到可导入的 .sb3(打包与自检)

摘要 从 planX.md 到可导入 sb3,中间只有两步:exec-plan 生成 project.json → build 规范打包 真正决定“导入成功率”的不是你写了多少积木,而是你有没有做 3 个自检:结构、资源、打包根目录 Windows 下最容易翻车的点我都踩过:.sb3 不能直接 Compress-Archive、JSON 深…...

AI大模型风口已至!4大高薪就业方向,助你精准转型少走弯路!

当下&#xff0c;AI大模型正从“技术爆发期”迈入“全面应用期”。对于IT从业者而言&#xff0c;这并非一道“要不要转”的选择题&#xff0c;而是一道“往哪转”的战略题。 很多人想抓住这波红利&#xff0c;却卡在“不知道从哪下手”“不清楚自己适合哪个赛道”的困境中。 …...

如何快速实现Brick Design国际化:构建多语言应用的完整指南

如何快速实现Brick Design国际化&#xff1a;构建多语言应用的完整指南 【免费下载链接】brick-design 低代码框架&#xff0c;支持流式布局与自由布局拖拽编排&#xff0c;可视化拖拽、随意嵌套组合、实时渲染、实时辅助线展示、自由布局支持辅助对齐、支持自动吸附、实时组件…...

智能体公司的发展都会变成解决方案型公司

当前AI智能体公司众多&#xff0c;但多数难以持续盈利。主要原因在于AI本质是工具&#xff0c;仅能解放生产力而非解决生产关系&#xff0c;对业务直接收入提升有限&#xff1b;其次&#xff0c;多数团队缺乏行业经验&#xff0c;商业模式局限于传统互联网模式&#xff0c;难以…...

涨薪技术|Prometheus中配置Alertmanager

在上面的部分中已经简单介绍过,在Alertmanager中通过路由(Route)来定义告警的处理方式。路由是一个基于标签匹配的树状匹配结构。根据接收到告警的标签匹配相应的处理方式。这里将详细介绍路由相关的内容。 Alertmanager主要负责对Prometheus产生的告警进行统一处理,因此在A…...

博途V15 S7-1200 PLC交通灯控制详解:触摸屏倒计时显示,仿真分析资料齐全,现成文件不修改

PLC交通灯控制&#xff0c;博途V15&#xff0c;S7-1200 使用比较指令&#xff0c;程序完整&#xff0c;触摸屏调试正常&#xff0c;触摸屏上有倒计时显示功能。 有两份对应实训报告(设计说明书&#xff09;&#xff0c;包括每段程序原理解释&#xff0c;触摸屏设置过程&#xf…...