代码随想录算法训练营DAY35|C++贪心算法Part.4|860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章目录

  • 860.柠檬水找零
    • 伪代码实现
    • CPP代码
  • 406.根据身高重建队列
    • 思路
    • 伪代码实现
      • 代码优化
    • CPP代码
  • 452. 用最少数量的箭引爆气球
    • 思路
    • 伪代码实现
    • CPP代码

860.柠檬水找零

力扣题目链接

文章讲解:860.柠檬水找零

视频讲解:贪心算法,看上去复杂,其实逻辑都是固定的!LeetCode:860.柠檬水找零

状态:这个题还是比较简单的,重点就是思路

贪心+模拟解题。

局部最优:遇到账单20,优先消耗美元10,完成本次找零。

全局最优:完成全部账单的找零。

伪代码实现

  • 首先我们手里一分钱都没有:

    int five = 0, ten = 0, twenty = 0;
    
  • 遇到5美元顾客

if (bill == 5) five++;
  • 遇到10美元顾客
if (bill == 10){if (five <= 0) return false;ten++;five--;
}
  • 遇到20美元:因为5美元即可以找10美元也可以找20美元,所以我们遇到20美元先用10美元来找零
if (five > 0 && ten > 0){five--;ten--;twenty++;
}else if (five >= 3) {five -= 3;twenty++;
}else return false;

CPP代码

class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0, twenty = 0;for (int bill : bills) {// 情况一if (bill == 5) five++;// 情况二if (bill == 10) {if (five <= 0) return false;ten++;five--;}// 情况三if (bill == 20) {// 优先消耗10美元,因为5美元的找零用处更大,能多留着就多留着if (five > 0 && ten > 0) {five--;ten--;twenty++; // 其实这行代码可以删了,因为记录20已经没有意义了,不会用20来找零} else if (five >= 3) {five -= 3;twenty++; // 同理,这行代码也可以删了} else return false;}}return true;}
};

406.根据身高重建队列

力扣题目链接

文章讲解:406.根据身高重建队列

视频讲解:贪心算法,不要两边一起贪,会顾此失彼 | LeetCode:406.根据身高重建队列

状态:本题我觉得最难的点就是将两个点分开考虑其实也是局部最优的一种,也就是说局部并不是说某个个体的多个方面,也可以是一个方面的全局考虑,然后再考虑其他方面的全局情况,然后构成全局最优。

思路

本题的思路是怎么来的呢?首先这里举个例子,h和k分别表示身高和队列前面身高大于等于该的人数

如果我们考虑k,并且如果k相同就把身高h小的放到队伍后面(因为k相同大身高如果放前面,k值肯定会冲突了)。这样考虑k的情况下

从图中可以看出,现在顺序还是乱乱得,并且并不好按照一个统一的思想进行调整。

那么我们考虑先按照h排序

从上图中可以看出,我们的身高这个维度已经固定了,我们再按照k这个维度从前往后遍历去进行排序。

涉及到两个纬度的比较,一定要分别考虑,这样思路才清晰

综上:

局部最优——首先按身高排序,然后考虑k的插入

全局最优——最后昨晚插入操作,整个队列满足题目队列属性

伪代码实现

  • 按照身高排序
static bool cmp (const vector<int>& a, const vector<int>& b) {if (a[0] == b[0]) return a[1] < b[1];return a[0] > b[0]
}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort (people.begin(), people.end(), cmp);
}
  • 定义一个二维向量来存放结果,并且就其k值来排序。由于我们已经按照身高排好序了,所以本文中我们只考虑k,并且对于k相同来说,身高小的排前面。
vector<vector<int>> que;
for (int i = 0; i < people.size(); i++){int postition = people[i][1];que.insert(que.begin() + position, people[i]);//暗含k相同情况下身高小的排在前面
}
requrn que;

代码优化

使用vector是非常费时的,C++中vector(可以理解是一个动态数组,底层是普通数组实现的)如果插入元素大于预先普通数组大小,vector底部会有一个扩容的操作,即申请两倍于原先普通数组的大小,然后把数据拷贝到另一个更大的数组上。

所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n2)了,甚至可能拷贝好几次,就不止O(n2)了。

用链表实现插入操作

list<vector<int>> que;
for (int i = 0; i < people.size(); i++){int position = people[i][1];//插入到下标为position的位置auto it = que.begin();while (position--){it++;}que.insert(it, people[i]);return vector<vector<int>>(que.begin(), que.end());
}

CPP代码

//链表实现
class Solution {
public:// 身高从大到小排(身高相同k小的站前面)static bool cmp(const vector<int>& a, const vector<int>& b) {if (a[0] == b[0]) return a[1] < b[1];return a[0] > b[0];}vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {sort (people.begin(), people.end(), cmp);list<vector<int>> que; // list底层是链表实现,插入效率比vector高的多for (int i = 0; i < people.size(); i++) {int position = people[i][1]; // 插入到下标为position的位置std::list<vector<int>>::iterator it = que.begin();while (position--) { // 寻找在插入位置it++;}que.insert(it, people[i]);}return vector<vector<int>>(que.begin(), que.end());}
};

452. 用最少数量的箭引爆气球

力扣题目链接
文章讲解452. 用最少数量的箭引爆气球
视频讲解:贪心算法,判断重叠区间问题 | LeetCode:452.用最少数量的箭引爆气球
状态:重叠问题是贪心算法中很重要的一类问题,一定要拿下!

思路

先将题目可视化一下子:

y轴是未知的,x轴是确定的,表示了气球的大小。对于points:[[1, 2] [3, 6] [7, 12] [4, 8] [10 16]]

输出:3

弓箭垂直于x轴往上射,每一次都尽量射爆最多的气球。

这样很容易可以推导出局部最优和全局最优:

局部最优——让弓箭尽可能射爆重叠的气球;

全局最优——把所有气球引爆,用的弓箭最少。

最真实的模拟过程其实是,每射爆一个气球就remove一个元素,但是我们其实完全可以先将气球排序,从前到后遍历气球,被射过的气球仅仅跳过就行

伪代码实现

  • 对数组进行排序:这是为了让我们更直观的观察到重叠的气球,这里我们按照气球的起始位置开始排序。
static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) return 0;sort(points.begin(), points.end(), cmp);
};
  • 在遍历过程中如果遇到重叠气球,就找到所有重叠气球中有边界的最小值,来上一根弓箭。
    • 以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序)
    • 代码实现上面还是非常精妙的,要反复体会
int result = 1; // points 不为空至少需要一支箭for (int i = 1; i < points.size(); i++) {//当前气球的起始位置大于前一个气球的终止位置if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=result++; // 需要一支箭}else {  // 气球i和气球i-1挨着points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界}}return result;

CPP代码

class Solution {
private:static bool cmp(const vector<int>& a, const vector<int>& b) {return a[0] < b[0];}
public:int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0) return 0;sort(points.begin(), points.end(), cmp);int result = 1; // points 不为空至少需要一支箭for (int i = 1; i < points.size(); i++) {if (points[i][0] > points[i - 1][1]) {  // 气球i和气球i-1不挨着,注意这里不是>=result++; // 需要一支箭}else {  // 气球i和气球i-1挨着points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界}}return result;}
};
时间复杂度:O(nlog n),因为有一个快排
空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间

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

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

相关文章

Windows系统部署Emby影音服务并实现无公网IP访问本地影视资源

文章目录 1.前言2. Emby网站搭建2.1. Emby下载和安装2.2 Emby网页测试 3. 本地网页发布3.1 注册并安装cpolar内网穿透3.2 Cpolar云端设置3.3 Cpolar内网穿透本地设置 4.公网访问测试5.结语 1.前言 本文主要介绍如何在Windows系统中&#xff0c;使用Cpolar内网穿透Emby&#xf…

C++入门(3)

文章目录 C入门auto同一行中定义多个变量auto不能推到的场景基于范围的for循环(C11)10. 指针空值nullptr(C11) C入门 auto auto&#xff1a;C11中&#xff0c;标准委员会赋予了auto全新的含义即&#xff1a;auto不再是一个存储类型指示符&#xff0c;而是作为一个新的类型指示…

linux信号机制分析

概念 信号递达&#xff1a;实际执行信号的处理动作就是信号递达 信号未决&#xff1a;信号从产生到递达之间的状态就是信号未决&#xff08;未决就是没有解决&#xff09; 收到某信号后&#xff0c;把未决信号集中的此信号置为1&#xff08;1表示未解决的信号&#xff09;&a…

2010年认证杯SPSSPRO杯数学建模B题(第一阶段)交通拥堵问题全过程文档及程序

2010年认证杯SPSSPRO杯数学建模 交通拥堵问题 B题 Braess 悖论 原题再现&#xff1a; Dietrich Braess 在 1968 年的一篇文章中提出了道路交通体系当中的Braess 悖论。它的含义是&#xff1a;有时在一个交通网络上增加一条路段&#xff0c;或者提高某个路段的局部通行能力&a…

OceanBase V4.2特性解析:用 Show Trace 快速定位数据库性能瓶颈

在数据库日常运维中&#xff0c;当遇到慢SQL问题时&#xff0c;若无法迅速查明原因&#xff0c;将极大地影响用户的使用感受&#xff0c;甚至可能引发业务或服务的中断。相较于单机数据库&#xff0c;分布式数据库系统因其涉及多个节点和多组件的协同工作&#xff0c;集群规模可…

计算IP地址总个数的方法及其应用

IP地址是计算机网络中用于唯一标识和定位设备的数字地址&#xff0c;是Internet Protocol&#xff08;IP&#xff09;的核心组成部分。计算IP地址的总个数是网络规划和管理中的重要任务之一&#xff0c;本文将介绍计算IP地址总个数的方法及其应用。 IP地址查询&#xff1a;IP数…

华为公司战略规划和落地方法之五看三定工具解析【PPT图片】(内含超级福利)

导言 华为公司最厉害之处就是战略上的高举高打&#xff0c;“吹过的牛都实现了”。支撑华为公司战略从规划到落地的主要工具很多&#xff0c;其中“五看三定”是战略规划时最核心的方法之一。本资料将介绍五看三定的核心精髓。欢迎学习&#xff01; 本材料结合谢宁老师专著《华…

【漏洞复现】锐捷 EG易网关 phpinfo.view.php 信息泄露漏洞

0x01 产品简介 锐捷EG易网关是一款综合网关产品&#xff0c;集成了先进的软硬件体系构架&#xff0c;并配备了DPI深入分析引擎、行为分析/管理引擎。这款产品能在保证网络出口高效转发的基础上&#xff0c;提供专业的流控功能、出色的URL过滤以及本地化的日志存储/审计服务。 …

# 从浅入深 学习 SpringCloud 微服务架构(二)模拟微服务环境(2)通过 RestTemplate 调用远程服务

从浅入深 学习 SpringCloud 微服务架构&#xff08;二&#xff09;模拟微服务环境&#xff08;2&#xff09;通过 RestTemplate 调用远程服务 段子手168 1、打开 idea 创建父工程 创建 artifactId 名为 spring_cloud_demo 的 maven 工程。 --> idea --> File -->…

基于SpringBoot的“幼儿园管理系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“幼儿园管理系统”的设计与实现&#xff08;源码数据库文档PPT) 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SpringBoot 工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 系统功能结构图 个人信息界面图 缴费信息管理界…

STM32 HAL库F103系列之DAC实验(一)

DAC输出实验 原理图 DAC数据格式 DAC输出电压 DORX - 数据输出寄存器 Vref 3.3V 实验简要 1&#xff0c;功能描述 通过DAC1通道1(PA4)输出预设电压&#xff0c; 然后由ADC1通道1 (PA1) 采集&#xff0c;最后显示ADC转换的数字量及换算后的电压值 2&#xff0c;关闭通道1…

2024平替电容笔买哪个品牌好?iPad电容笔全能榜单热门款TOP5分享!

2024年&#xff0c;随着科技的不断发展和消费者对生活品质的追求&#xff0c;电容笔作为一种创新的无纸化工具&#xff0c;逐渐走进人们的生活和工作中。然而&#xff0c;在电容笔市场的繁荣背后&#xff0c;也隐藏着品质良莠不齐的现象。众多品牌为了追求利润&#xff0c;推出…

SCSS全局配置 vue项目(二)

目录 1、先要查看node版本 2、安装对应的node-sass、sass-loader版本 2.1根据项目使用的node版本安装对应的node-sass版本 2.2根据node-sass版本选择兼容的sass-loader版本&#xff0c;不然项目无法正常运行 3、在 vue.config.js 中配置&#xff1a; 4、在组件中…

QT QZipReader改进,以支持大于2G的zip文件

QZipReader对ZIP文件读取非常方便好用。即使在最新版的QT 6.6.1里&#xff0c;仍然存在一些问题&#xff1a;对于大于2G的zip文件不支持。 虽然有标准zlib可调用&#xff0c;但包装成一个易用且功能成熟的zip解压功能库&#xff0c;还是有很大的工作量&#xff0c;也需要有一定…

【理性讨论】进口主食冻干高价是不是智商税?SC主食冻干全解+测评分享

说到高端主食冻干产品&#xff0c;SC无疑是其中的明星品牌。无论是在哪个平台搜索“主食冻干”等关键词&#xff0c;SC都能轻松进入视线。在双11、618等促销活动中&#xff0c;尽管SC的价格相对较高&#xff0c;但其销量却还不错&#xff0c;这足以说明众多宠物主人对SC冻干品质…

国产技术迎来突破,光量子芯片横空出世,中文编程也有好消息

国外光刻机不再牛&#xff0c;随着这项技术问世&#xff0c;我们摆脱芯片卡脖子困境成为可能&#xff01; 欧美国家在科技领域一直遥遥领先&#xff0c;那我们该如何实现后来居上呢&#xff1f;答案就在于我国在全球处于领先地位的量子科技&#xff0c;以及新近问世、令人瞩目…

如何在React中构建动态下拉组件 - 解释React复合组件模式

下拉菜单长期以来一直是网站和应用程序中的重要组成部分。它们是用户交互的默默英雄&#xff0c;通过简单的点击或轻触默默地促进着无数的操作和决策。 今天你可能已经遇到了其中之一&#xff0c;无论是在你最喜爱的在线商店上选择类别&#xff0c;还是在注册表单上选择你的出…

骨传导耳机哪个牌子好?5款年度精品骨传导耳机推荐

在骨传导耳机最开始出现的时候&#xff0c;相信很多人都只关心骨传导耳机的外观颜值和特殊的传声方式&#xff0c;但当你真正用过一段时间后&#xff0c;对骨传导耳机有了更加深入的了解后就会关注到骨传导耳机的使用体验、音质表现、蓝牙性能等具体功能&#xff0c;而随着骨传…

上位机图像处理和嵌入式模块部署(树莓派4b的一种固件部署方法)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 如果软件开发好了之后&#xff0c;下面就是实施和部署。对于树莓派4b来说&#xff0c;部署其实就是烧录卡和拷贝文件。之前我们烧录卡&#xff0c;…

RK3568 学习笔记 : u-boot 千兆网络无法 ping 通PC问题的解决

前言 开发板型号&#xff1a; 【正点原子】 的 RK3568 开发板 使用 虚拟机 ubuntu 20.04 收到单独 编译 RK3568 u-boot 【问题】u-boot 千兆网络无法ping 通&#xff1f;Linux 下千兆网络正常&#xff0c;说明&#xff1a;开发板硬件正常 u-boot 下网络如果通了&#xff0c;…