day35 柠檬水找零 根据身高重建队列 用最少数量的箭引爆气球

题目1:860 柠檬水找零

题目链接:860 柠檬水找零

题意

一杯柠檬水5美元,每位顾客只买一杯柠檬水,支付5美玉,10美元,20美元,必须正确找零

开始时并没有零钱 若可以正确找零,则返回true,反之返回false

贪心策略

尽可能保留5美元的零钱,5更万能(既能对10找零,又能对20找零) 优先使用10进行找零

代码

class Solution {
public:bool lemonadeChange(vector<int>& bills) {if(bills[0]!=5) return false;int nums5 = 0;int nums10 = 0;int nums20 = 0;for(int i=0;i<bills.size();i++){if(bills[i]==5) nums5 += 5;if(bills[i]==10){if(nums5!=0){nums5 -= 5;nums10 += 10;}else return false;}if(bills[i]==20){if(nums10!=0 && nums5!=0){nums10 -= 10;nums5 -= 5;}else if(nums5>=15){nums5 -= 15;}else return false;}}return true;}
};
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

题目2:406 根据身高重建队列

题目链接:406 根据身高重建队列

题意

people[i]=[hi,ki]   表示第i个人的身高是hi,前面有ki个身高大于等于hi的人,按正确顺序重组队列

贪心策略

先确定一个维度,先比较h的维度,按照h从大到小排序,然后再比较k的维度 按照k从小到大往前插入

数组

代码

class Solution {
public:static bool cmp(vector<int>& a,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) {vector<vector<int>> queue;//身高按照降序排序,从大到小排序sort(people.begin(),people.end(),cmp);//根据k插入到队列前面  注意是插入到队列哦,不是peoplefor(int i=0;i<people.size();i++) queue.insert(queue.begin()+people[i][1],people[i]);return queue;}
};
  • 时间复杂度:O(nlog n + n^2)
  • 空间复杂度:O(n)

!!!注意!!!

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

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

链表
class Solution {
public:static bool cmp(vector<int>& a,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) {list<vector<int>> que;//身高按照降序排序,从大到小排序sort(people.begin(),people.end(),cmp);//根据k插入到队列前面  注意是插入到队列哦,不是peoplefor(int i=0;i<people.size();i++){int position = people[i][1];std::list<vector<int>>::iterator it=que.begin();while(position--){it++;}que.insert(it,people[i]);}return vector<vector<int>>(que.begin(),que.end());}
};
  • 时间复杂度:O(nlog n + n^2)
  • 空间复杂度:O(n)

题目3:452 用最少数量的箭引爆气球

题目链接:452 用最少数量的箭引爆气球

题意

points[i]=[xstart,xend]表示水平直径在xstart和xend之间的气球,y坐标未知

一支箭可以从垂直x轴的任意位置x处射出一直前进,若xstart<=x<=xend,气球会被引爆,求最小弓箭数

贪心策略

重叠区间的气球用1个箭射中,箭的数量最少

代码

class Solution {
public:static bool cmp(vector<int>& a, vector<int>& b){//左边界升序return a[0]<b[0];}int findMinArrowShots(vector<vector<int>>& points) {//对数组的左边界升序排序sort(points.begin(),points.end(),cmp);//收集弓箭数int result = 1;for(int i=1;i<points.size();i++){//两气球不重叠if(points[i][0]>points[i-1][1]) result++;//两气球重叠else{//判断第三个气球,更新右边界points[i][1] = min(points[i][1],points[i-1][1]);}}return result;}
};
  • 时间复杂度:O(nlog n),因为有一个快排
  • 空间复杂度:O(1),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间

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

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

相关文章

【教程】苹果上架常见要求的有哪些?

引言 苹果上架要求是苹果公司对于提交应用程序到苹果商店上架的要求和规定。这些要求主要是为了保证用户体验、应用程序的质量和安全性。开发者在准备提交应用程序之前&#xff0c;务必了解并遵守苹果上架要求&#xff0c;以确保应用程序能够通过苹果公司的审核。 1. 合法合规…

[C++]类和对象(中)

一:类的六个默认成员函数 如果一个类中什么成员都没有&#xff0c;简称为空类。空类中并不是什么都没有&#xff0c;任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为…

Transformer 自然语言处理(四)

原文&#xff1a;Natural Language Processing with Transformers 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十章&#xff1a;从头开始训练变换器 在本书的开头段落中&#xff0c;我们提到了一个名为 GitHub Copilot 的复杂应用&#xff0c;它使用类似 GPT 的…

【持续更新】2024牛客寒假算法基础集训营1题解 | JorbanS

文章目录 [A - DFS搜索](https://ac.nowcoder.com/acm/contest/67741/A)[B - 关鸡](https://ac.nowcoder.com/acm/contest/67741/B)[C - 按闹分配](https://ac.nowcoder.com/acm/contest/67741/C)[E - 本题又主要考察了贪心](https://ac.nowcoder.com/acm/contest/67741/E)[F -…

STM32 DMA的基本原理和工作机制解析

STM32微控制器中的DMA&#xff08;Direct Memory Access&#xff0c;直接内存访问&#xff09;是一种用于高效数据传输的特殊硬件功能。DMA允许外设之间直接进行数据传输&#xff0c;而无需CPU的干预。下面&#xff0c;我将为您详细解释STM32 DMA的基本原理和工作机制。 ✅作者…

【python接口自动化】- 对接各大数据库

&#x1f525; 交流讨论&#xff1a;欢迎加入我们一起学习&#xff01; &#x1f525; 资源分享&#xff1a;耗时200小时精选的「软件测试」资料包 &#x1f525; 教程推荐&#xff1a;火遍全网的《软件测试》教程 &#x1f4e2;欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1…

【Qt】—— Hello World程序的实现

目录 &#xff08;一&#xff09;使⽤"按钮"实现 1.1 纯代码方式实现 1.2 可视化操作实现 &#xff08;二&#xff09;使⽤"标签"实现 2.1 纯代码方式实现 2.2 可视化操作实现 &#xff08;一&#xff09;使⽤"按钮"实现 1.1 纯代码方式实…

【Qt学习笔记】(二)信号和槽

信号和槽 1 信号和槽概述2 信号和槽的使用3 可视化生成槽函数4 自定义信号和槽5 带参数的信号和槽6 信号与槽的连接方式7 信号与槽的断开8 使用 Lambda 表达式来定义槽函数 1 信号和槽概述 在Qt中&#xff0c;用户和控件的每次交互过程称为一个事件。比如"用户点击按钮&q…

轻松打造智能化性能测试监控平台:【JMeter+Grafana+Influxdb】的优化整合方案

在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系统、应…

Redis的bitmap使用不当,我内存爆了

背景 最近发现Redis的内存持续暴涨&#xff0c; 涨的有点吓人&#xff0c;机器都快扛不住了&#xff0c;不得不进行Redis内存可视化分析&#xff0c;发现大量的String类型的大key 经分析&#xff0c;最近上线了页面UV的统计&#xff0c;那目前如何做的呢&#xff1f; 通过访…

西瓜书学习笔记——k近邻学习(公式推导+举例应用)

文章目录 算法介绍实验分析 算法介绍 K最近邻&#xff08;K-Nearest Neighbors&#xff0c;KNN&#xff09;是一种常用的监督学习算法&#xff0c;用于分类和回归任务。该算法基于一个简单的思想&#xff1a;如果一个样本在特征空间中的 k k k个最近邻居中的大多数属于某个类别…

【Docker】网络配置network详解

一&#xff0c;network的概述 解决痛点&#xff08;能干什么&#xff1f;&#xff09;&#xff1a; &#xff08;1&#xff09;容器间的互联和通信以及端口映射 &#xff08;2&#xff09;容器IP变动时候&#xff0c;可以通过服务名直接网络通信而不受到影响 二&#xff0c;n…