代码随想录第27天|贪心算法part1

455.分发饼干

在这里插入图片描述
先给孩子和饼干排序,每次选取一个最大的饼干给一个最大胃口的孩子,直到饼干分完或者遍历完孩子

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index = s.size() - 1;int res = 0;for (int i = g.size() - 1; i >= 0; i--) {if (index >= 0 && s[index] >= g[i]) {index--;res++;}}return res;}
};

或者换一种想法,从小到大遍历饼干,每次分配一个饼干给小朋友,能给index就++

class Solution {
public:int findContentChildren(vector<int>& g, vector<int>& s) {sort(g.begin(), g.end());sort(s.begin(), s.end());int index = 0;for (int i = 0; i < s.size(); i++) {if (index < g.size() && s[i] >= g[index]) {index++;}}return index;}
};

376.摆动序列

在这里插入图片描述
如果只有一个元素,则答案为1
如果有两个元素,则如果两个元素不相同,答案为2,否则为1
这是需要注意的地方

本题需要绘制一个图,能看出来峰值的关系
在这里插入图片描述
只需要把那些非峰值上的点删除,就是最长的摆动序列
因为对于非峰值的点,其都是无关紧要的
当坡度发生变化时,只需要找到该坡度里的极点即可

局部最优:删除单调坡度上的节点(不包括单调坡度两端的节点),那么这个坡度就可以有两个局部峰值。
整体最优:整个序列有最多的局部峰值,从而达到最长摆动序列

本题要考虑三种情况:

情况一:上下坡中有平坡
在这里插入图片描述
可以统一规则,删除前面的3个2,留下最后一个,序列变成[1,2,1],答案为3
在这里插入图片描述

当 i 指向第一个 2 的时候,prediff > 0 && curdiff = 0 ,当 i 指向最后一个 2 的时候 prediff = 0 && curdiff < 0
当 prediff = 0 && curdiff < 0 也要记录一个峰值,因为他是把之前相同的元素都删掉留下的峰值。
所以我们记录峰值的条件应该是: (preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
那么如果选择保留第一个2,删除其余2的时候,额外的判断条件应该是prediff!=0 && curdiff=0

情况二:数组首尾两端
对于左右端点的判断情况
如果只有两个不同的元素,那摆动序列也是 2
例如序列[2,5],如果靠统计差值来计算峰值个数就需要考虑数组最左面和最右面的特殊情况。
左端点是没有prediff的,右端点没有curdiff,如果不需要写if特判的话,那么我们需要假设左端点前面有一个虚拟端点,其值和左端点是一样的,则左端点prediff=0
在这里插入图片描述
而对于右端点,我们直接假设其已经是一个峰值了(其必定为一个峰值,因为它是最后一个元素,可以画图想一下原理,要么就是极值,要么就是摆动的第一个元素),所以我们答案初始就为1
针对以上情形,result 初始为 1(默认最右面有一个峰值),对于左端点,此时 curDiff > 0 && preDiff <= 0,那么 result++(计算了左面的峰值),最后得到的 result 就是 2(峰值个数为 2 即摆动序列长度为 2)

情况三:单调坡中有平坡
我们忽略了一种情况,即 如果在一个单调坡度上有平坡
在这里插入图片描述
如果按照之前的条件
(preDiff <= 0 && curDiff > 0) || (preDiff >= 0 && curDiff < 0)
那么在最后一个2的时候,result就会+1,这明显是不对的,因为答案应该为2->序列是[1,4]
之所以会出问题是因为prediff实时更新
我们应该在坡度变化的时候再用curdiff更新prediff,这样它记录了之前的坡度方向(大于0和小于0),这样到1的时候prediff被更新为1,表示是一个上坡,然后坡度没变化的时候prediff一直是1,到了最后一个2的时候prediff>0,curdiff>0,所以长度不会增加

class Solution {
public:int wiggleMaxLength(vector<int>& nums) {if (nums.size() <= 1)return nums.size();int curdif = 0;int predif = 0;int res = 1;for (int i = 0; i < nums.size() - 1; i++) {curdif = nums[i + 1] - nums[i];if ((predif <= 0 && curdif > 0) || (predif >= 0 && curdif < 0)) {res++;// 只有坡度变化才记录predif = curdif;}}return res;}
};

53.最大子数组和

在这里插入图片描述
贪心
局部最优:当前“连续和”为负数的时候立刻放弃,从下一个元素重新计算“连续和”,因为负数加上下一个元素 “连续和”只会越来越小。

全局最优:选取最大“连续和”
局部最优的情况下,并记录最大的“连续和”,可以推出全局最优。

从代码角度上来讲:遍历 nums,从头开始用 sum 累积,如果 sum一旦加上 nums[i]变为负数,那么就应该从 nums[i+1]开始从 0 累积 sum 了,因为已经变为负数的 count,只会拖累总和。

class Solution {
public:int maxSubArray(vector<int>& nums) {if (nums.size() == 1)return nums[0];int sum = 0;int res = -INT_MAX;for (int i = 0; i < nums.size(); i++) {if (sum <= 0)sum = 0;sum += nums[i];res = max(res, sum);}return res;}
};

前缀和的做法也是可以的,用两个变量
maxsum和minprefixsum来分别记录遍历到的最大子数组和以及最小前缀和
首先计算前缀和数组,sum[0] = 0
maxsum初始化为最小的int,minprefixsum初始化为0.
从前往后依次遍历各个前缀和,记录最大的前缀和之差,将其保存在maxsum,因为前缀和之差就是区间和
同时记录最小的前缀和,因为一个后面的前缀和 sum[i]减去前面最小的前缀和minprefixsum,得到的一定是以当前数nums[i-1]为右端点的最大的区间和

class Solution {
public:int maxSubArray(vector<int>& nums) {if (nums.size() == 1)return nums[0];int n = nums.size();vector<int> sum(n + 1, 0);for (int i = 0; i < nums.size(); i++) {sum[i + 1] = sum[i] + nums[i];}int maxsum = INT_MIN;int minprefixsum = sum[0];for (int i = 1; i <= n; i++) {maxsum = max(maxsum, sum[i] - minprefixsum);minprefixsum = min(minprefixsum, sum[i]);}return maxsum;}
};

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

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

相关文章

Vue3【三】 使用TS自己编写APP组件

Vue3【三】 使用TS自己编写APP组件 运行截图 目录结构 注意目录层级 文件源码 APP.vue <template><div class"app"><h1>你好世界!</h1></div> </template><script lang"ts"> export default {name:App //组…

JavaScript的核心语法

JavaScript JavaScript&#xff1a;JavaScript的组成&#xff1a;核心语法&#xff1a;Hello&#xff1a;变量&#xff1a;JS的基本数据类型&#xff1a;特殊点&#xff1a; 数组&#xff1a;流程控制语句&#xff1a;函数&#xff1a;函数的重载&#xff1a;函数的递归:预定义…

在 VSCode 中搭建 Flutter 开发环境并运行项目

要在 Visual Studio Code (VSCode) 中运行 Flutter 项目并启动虚拟机&#xff08;例如 Android Emulator&#xff09;&#xff0c;可以按照以下步骤进行设置和操作&#xff1a; 一、安装 Flutter 和 Dart 插件 安装 Flutter SDK&#xff1a; 前往 Flutter 官网 下载并安装 Flu…

离散数学答疑 3

&#xff5e;A&#xff1a;A的补集 有时候空集是元素&#xff0c;有时候就是纯粹的空集 A-B的定义&#xff1a; 笛卡尔积&#xff1a; 求等价关系&#xff1a;先求划分再一一列举 不同划分&#xff1a;分几块。一块&#xff1a;两块&#xff1a;三块&#xff1a;分别计算 Ix是…

自然语言处理(NLP)—— 主题建模

1. 主题建模的概念 主题建模&#xff08;Topic Modeling&#xff09;是一种用于发现文档集合&#xff08;语料库&#xff09;中的主题&#xff08;或称为主题、议题、概念&#xff09;的统计模型。在自然语言处理和文本挖掘领域&#xff0c;主题建模是理解和提取大量文本数据隐…

【常用工具系列】Git 教程——从入门到大师

目录 前言一、Git 基础1-1、Git 简介与安装安装 Git 1-2、 Git 工作流程1-3、 Git 配置与管理用户配置查看配置 1-4、 Git 仓库操作克隆仓库推送更改拉取更新 1-5 Git 分支管理创建分支切换分支删除分支解决冲突 二、 Git 进阶2-0、 Git 标签使用创建标签查看标签检出标签推送标…

「动态规划」如何求最小路径和?

64. 最小路径和https://leetcode.cn/problems/minimum-path-sum/description/ 给定一个包含非负整数的m x n网格grid&#xff0c;请找出一条从左上角到右下角的路径&#xff0c;使得路径上的数字总和为最小。说明&#xff1a;每次只能向下或者向右移动一步。 输入&#xff1a;…

《嵌入式系统导论》

计算题 已知位带别名基地址为0x220000000,计算位于位带区的0x200FFFFF地址的数据位7,计算它对应的位带别名区地址。 别名地址=位带别名基地址+字节偏移量x32+位号x4 别名地址=0x22000000+(0x200FFFFF -0x20000000)*32+7*4=0x220000807 分析如下基本定时器配置语句。 { ………

ctfshow-web入门-命令执行(web37-web40)

目录 1、web37 2、web38 3、web39 4、web40 命令执行&#xff0c;需要严格的过滤 1、web37 使用 php 伪协议&#xff1a; ?cphp://input post 写入我们希望执行的 php 代码&#xff1a; <?php system(tac f*);?> 拿到 flag&#xff1a;ctfshow{5c555d9a-6f55…

Mongodb数组元素更新之使用$定位数组第一个元素

学习mongodb&#xff0c;体会mongodb的每一个使用细节&#xff0c;欢迎阅读威赞的文章。这是威赞发布的第63篇mongodb技术文章&#xff0c;欢迎浏览本专栏威赞发布的其他文章。 阅读了不少Mongodb的文章&#xff0c;也和同事交流过。Mongodb数组更新是比较难理解的地方&#x…

EXCEL多sheet添加目录跳转

EXCEL多sheet添加目录跳转 背景 excel中有几十个sheet&#xff0c;点下方左右切换sheet太耗时&#xff0c;希望可以有根据sheet名超链接跳转相应sheet&#xff0c;处理完后再跳回原sheet。 方案一 新建目录sheet&#xff0c;在A1写sheet名&#xff0c;右键选择最下方超链接…

问题:材料题请点击右侧查看材料问题 查看材料 #学习方法#经验分享#学习方法

问题&#xff1a;材料题请点击右侧查看材料问题 查看材料 A.Colleges may reduce their enrollment. B.Top universities become increasingly competitive. C.Universities become selective in student admission. D.Colleges invest less in academy and infrastructure…

Go 文件压缩解压

在Go语言中&#xff0c;archive/zip包提供了创建、读取和解压缩ZIP格式文件的功能。 一、创建ZIP文件并添加内容----压缩 package mainimport ("archive/zip""bytes""fmt""io""log""os" )func main() {// 创建一…

el-input中change事件造成的坑

el-input中change事件造成的坑 一、change事件定义二、如果仅回车时候触发 一、change事件定义 仅在输入框失去焦点或用户按下回车时触发 二、如果仅回车时候触发 <el-inputv-model.trim"questionInput"placeholder"请输入你的问题&#xff0c;按回车发送&…

智慧视觉怎么识别视频?智慧机器视觉是通过什么步骤识别视频的?

智慧视觉功能怎么识别视频&#xff1f;智慧视觉是搭载在智能设备比如手机、AI盒子、机器视觉系统上的一个应用程序或特性&#xff0c;采用计算机视觉和人工智能的技术来识别图像或视频中的内容。如果想了解视频识别&#xff0c;就要明白智慧视觉功能会涉及的以下几个关键步骤和…

pxe自动装机

概念 pxe是c/s模式。允许客户端通过网络从远程服务器&#xff08;服务端&#xff09;下载引导镜像&#xff0c;加载安装文件&#xff0c;实现自动化安装操作系统。 无人值守&#xff1a;安装选项不需要人为干预&#xff0c;可以自动化实现。 pxe的优点&#xff1a;1.规模化&…

机器人阻抗控制中的机械阻抗模型

机器人阻抗控制中的机械阻抗模型主要涉及到通过修改机器人与环境接触作业的动力学模型&#xff0c;使其等效为一个期望的阻抗&#xff08;弹簧-质量-阻尼&#xff09;模型。以下是对机械阻抗模型在机器人阻抗控制中的详细解释&#xff1a; 阻抗控制原理&#xff1a; 机器人阻抗…

Python——泰坦尼克号数据分析

目录 🧾1.数据集(部分数据) ✏️ 2、导入数据集与必要模块 ⌨️ 3.数据预处理 1️⃣ isnull函数查看有无缺失值 2️⃣fillna函数填充缺失值 📍 Age字段使用平均值填充缺失值 📍 Embarked字段填充缺失值 3️⃣ 删除缺失值较多的字段 📊 4.数据可视化 1️⃣ di…

流媒体服务器SMS-语音对讲(二)

1.简介 上篇文件介绍了流媒体与设备之间可能的交互场景&#xff0c;本文将介绍客户端或者web端与摄像头对讲的总体流程。 老规矩&#xff0c;介绍一下本人的开源流媒体&#xff0c;点个star&#xff0c;有兴趣一起开发的朋友也可以联系本人&#xff1a;https://gitee.com/inyem…

PostgreSQL的发布和订阅功能

发布和订阅功能在 PostgreSQL 9.0 版本中首次引入,并进一步改进和增强了后续版本中。所以,从 PostgreSQL 9.0 版本开始,就可以使用发布和订阅功能来实现数据复制和同步 发布和订阅功能在 PostgreSQL 中提供了一种灵活、可靠的数据复制和同步机制,具有许多优点和一些缺点:…