代码随想录算法训练营第34天| Leetcode 860.柠檬水找零、406.根据身高重建队列、452. 用最少数量的箭引爆气球

文章目录

    • Leetcode 860.柠檬水找零
    • Leetcode 406.根据身高重建队列
    • Leetcode 452. 用最少数量的箭引爆气球

Leetcode 860.柠檬水找零

题目链接:Leetcode 860.柠檬水找零
题目描述: 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

每位顾客只买一杯柠檬水,然后向你付 5 美元、10美元或 20 美元。你必须给每个顾客正确找零,也就是说净交易是每位顾客向你支付 5 美元。

注意,一开始你手头没有任何零钱。

给你一个整数数组 bills ,其中 bills[i]是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true ,否则返回 false
思路: 本题还是很简单的,我们只需要分情况讨论:

  1. 对于5美元的顾客,直接收下即可
  2. 对于10美元的顾客,我们需要判断5美元的零钱是否大于等于1张
  3. 对于20美元的顾客,我们先判断能否使用10+5的组合,再判断5美元的零钱是否大于等于3张(这里体现了贪心思想)

代码如下:

class Solution {
public:bool lemonadeChange(vector<int>& bills) {int five = 0, ten = 0; //只需记录这两种钞票用于找零for (int bill : bills) {if (bill == 5) {five++;}if (bill == 10) {if (five <= 0)return false;ten++;five--;}if (bill == 20) {if (five > 0 && ten > 0) { //贪心策略:优先使用10来找零ten--;five--;} else if (five >= 3) {five -= 3;} elsereturn false;}}return true;}
};
  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

Leetcode 406.根据身高重建队列

题目链接:Leetcode 406.根据身高重建队列
题目描述: 假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。
思路: 本题和Leetcode135 分发糖果这道题很像,都是需要考虑两个维度,而对于两个维度的贪心题目,我们需要先确定一个维度,再确定另一个维度。 如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。

那么按照身高h来排序呢?身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高,再按照k为下标重新插入队列就可以了。

  • 局部最优:优先按身高高的peoplek来插入。插入操作过后的people满足队列属性

  • 全局最优:最后都做完插入操作,整个队列满足题目队列属性

代码如下:

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);vector<vector<int>> que;for (int i = 0; i < people.size(); i++) {int position = people[i][1];que.insert(que.begin() + position, people[i]);}return que;}
};

由于动态数组vector底层是普通数组实现的,我们都知道在数组内插入删除元素效率很低,因此可以考虑用链表list优化。

代码如下:(利用链表list提高插入效率)

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底层是链表,插入效率高for (int i = 0; i < people.size(); i++) {int position = people[i][1];auto it = que.begin();while (position--) { //寻找插入位置it++;}que.insert(it, people[i]);}return vector<vector<int>>(que.begin(), que.end());}
};
  • 时间复杂度: O ( n l o g n + n 2 ) O(nlog n + n^2) O(nlogn+n2)
  • 空间复杂度: O ( n ) O(n) O(n)

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

题目链接: Leetcode 452. 用最少数量的箭引爆气球
题目描述: 在二维空间中有许多球形的气球。对于每个气球,提供的输入是水平方向上,气球直径的开始和结束坐标。

一支弓箭可以沿着 x轴从不同点完全垂直地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstartxend, 且满足 xstart ≤ x ≤ xend,则该气球会被引爆。可以射出的弓箭的数量没有限制。 弓箭一旦被射出之后,可以无限地前进。我们想找到使得所有气球全部被引爆,所需的弓箭的最小数量。

给你一个数组 points ,其中 points [i] = [xstart,xend] ,返回引爆所有气球所必须射出的最小弓箭数。
思路: 本题看似是二维空间,实际上只需考虑气球的横坐标范围是否重叠就行了,纵坐标只是方便描述弓箭射出的出题背景。首先对气球左边界排序,然后遍历横坐标判断当前的ii-1是否重叠,如果不重叠,result++;重叠则更新右边界。 这里有一个关键点就是如何更新右边界?我们需要对points[i]points[i-1]的右边界取最小值,只有这样才方便后续继续判断是否重叠。

代码如下:

class Solution {
public: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];}int findMinArrowShots(vector<vector<int>>& points) {if (points.size() == 0)return 0;int result = 1;sort(points.begin(), points.end(), cmp); //按照左边界大小进行排序for (int i = 1; i < points.size(); i++) {if (points[i][0] > points[i-1][1]) { //如果没有重叠,则弓箭数+1result++;} else { //否则更新右边界points[i][1] = min(points[i - 1][1], points[i][1]);}}return result;}
};
  • 时间复杂度: O ( n l o g n ) O(nlog n) O(nlogn)
  • 空间复杂度: O ( 1 ) O(1) O(1)
    不过快速排序的空间复杂度还体现在递归上了:
    最优的情况下空间复杂度为: O ( l o g n ) O(logn) O(logn);每一次都平分数组的情况
    最差的情况下空间复杂度为: O ( n ) O( n ) O(n) ;退化为冒泡排序的情况

总结: 很多贪心类题目第一次做几乎不太可能想到,因此需要多做题(拓宽视野)+多复习(巩固)

最后,如果文章有错误,请在评论区或私信指出,让我们共同进步!

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

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

相关文章

linux系统---防火墙

目录 一、防火墙的认识 1.防火墙定义 2.防火墙分类 二、Linux系统防火墙 1.Netfilter 2.防火墙工具介绍 2.1iptables 2.2firewalld 2.3nftables 2.4netfilter的五个勾子函数和报文流向 2.4.1五个勾子 2.4.2三种报文流向 3.iptables 3.1iptables概述 3.2iptables…

算法训练营day30,贪心算法4

import "sort" // 860. 柠檬水找零 func lemonadeChange(bills []int) bool { //如果最开始就大于5元&#xff0c;肯定无法找零直接返回false if len(bills) > 0 && bills[0] > 5 { return false } five : 0 ten : 0 twenty : 0 for i : 0; i < l…

Python在金融大数据分析中的AI应用实战

&#x1f482; 个人网站:【 海拥】【神级代码资源网站】【办公神器】&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交流的小伙伴&#xff0c;请点击【全栈技术交流群】 随着人工智能时代的到来&#xff0c;Python作为…

Java入门教程:介绍、优势、发展历史以及Hello World程序示例

Java入门教学 java语言介绍 Java是由Sun Microsystems公司(已被Oracle公司收购)于1995年5月推出的Java面向对象程序设计语言和Java平台的总称。由James Gosling和同事们共同研发&#xff0c;并在1995年正式推出。 Java分为三个体系&#xff1a; JavaSE&#xff08;J2SE&…

cyk追楠神系列三

cyk追楠神系列三 Description 众所周知&#xff0c;cyk给楠神写了一封信表白。作为有一个有礼貌的五好青年&#xff0c;楠神当然得给 cyk 写一封回信咯&#xff0c;俗称“好人信”。 楠神是一个非常有文采的人&#xff0c;他在信里引用了很多名言来安慰 cyk&#xff0c;有时候…

最长公共子序列和最长公共子串

最长公共子序列 题目描述 给出1,2,…,n 的两个排列P1 和 P2 &#xff0c;求它们的最长公共子序列。 输入格式 第一行是一个数 n。 接下来两行&#xff0c;每行为 n 个数&#xff0c;为自然数1,2,…,n 的一个排列。 输出格式 一个数&#xff0c;即最长公共子序列的长度。…

浅谈iPaaS对企业转型的重要性

面对数字化转型的大浪潮&#xff0c;众多企业都期望着能快速实现全面的数字化转型&#xff0c;让企业在日益激烈的竞争中拥有更稳的市场地位&#xff0c;提升自身的实力及能力&#xff0c;奠定更坚实的基底。但在数字化转型过程中&#xff0c;部分企业数字化基础水平较薄弱&…

Spring Boot注入PasswordEncoder失败

问题 以Autowired方式注入PasswordEncoder对登录密码进行校验&#xff0c;启动时报错如下 Description:Field userService in com.lyx.springboot.controller.UserController required a bean of type org.springframework.security.crypto.password.PasswordEncoder that co…

C语言:国家名称按字母表排序

题目描述 输入一个整数n(n<20)&#xff0c;表示待输入国家的数量。随后输入n个国家或地区的名称 (名称长度为1~30)&#xff0c;要求按字母顺序升序输出。 注意&#xff1a;名称中可能包含空格符。 提示 字符串比较请使用函数&#xff1a; int strcmp(const char* str1&a…

开源软件:推动软件行业繁荣的力量

文章目录 &#x1f4d1;引言开源软件的优势分析开放性与透明度低成本与灵活性创新与协作 开源软件对软件行业的影响推动技术创新和进步促进软件行业的合作与交流培养人才和提高技能促进软件行业的可持续发展 结语 &#x1f4d1;引言 随着信息技术的飞速发展&#xff0c;软件已经…

设计模式Python实现

过年在家瞎折腾&#xff0c;闲着无聊看到设计模式&#xff0c;于是就想着用Python实现一下。 简单工厂 根据传入的参数决定创建出哪一种产品类的实例。 class CashFactory:def createCashAdapter(self, type):if type "满100减20":return CashReturn(100, 20)elif…

Sora爆火,普通人的10个赚钱机会

您好&#xff0c;我是码农飞哥&#xff08;wei158556&#xff09;&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。&#x1f4aa;&#x1f3fb; 1. Python基础专栏&#xff0c;基础知识一网打尽&#xff0c;9.9元买不了吃亏&#xff0c;买不了上当。 Python从入门到精通…

Linux的命令简记

查看网络设置的命令是什么 Ifconfig 要想在PATH中添加命令要用到什么命令 PATH"$PATH":目录的绝对路径 复制文件的命令是什么 Cp 源文件 目标文件 cp命令怎么递归复制 Cp -r Cp命令怎么查询是否覆盖 Cp -i cp命令怎么把文件的权限也都复制过来 Cp -a 如果要复制目录要…

spring boot自动装配

第一步需要在pom.xml文件指定需要导入的坐标 要是没有自动提示需要检查maven有没有 实现代码 /*springboot第三方自动配置实现方法 * 什么是自动配置 自动配置就是springboot启动自动加载的类不需要在手动的控制反转自动的加入bean中 * * *//*第一种方案包扫描 不推荐因为繁琐…

2024 VNCTF----misc---sqlshark sql盲注+流量分析

流量分析 wireshark 可以看到很多 any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(80))),1,0))# P any/**/Or/**/(iF(((((Ord(sUbstr((sElect(grOup_cOncat(password))frOm(users)) frOm 1 fOr 1))))in(104))),1,0))#…

18-k8s控制器资源-cronjob控制器

job控制器是执行完一次任务&#xff0c;就结束&#xff1b; cronjob控制器&#xff0c;是基于job控制器&#xff0c;定期频率性执行任务&#xff1b;等同于linux系统中的crontab一样&#xff1b; 1&#xff0c;编辑cronjob资源清单 [rootk8s231 pi]# vim cronjob.yaml apiVers…

mfc140u.dll文丢失导致应用程序无法正常,有哪些解决办法

mfc140u.dll是Microsoft Foundation Classes&#xff08;MFC&#xff09;的一个重要组件&#xff0c;它提供了许多用于开发Windows应用程序的功能和工具。然而&#xff0c;当系统或应用程序升级、恶意软件感染或文件损坏以及用户错误操作等情况发生时&#xff0c;mfc140u.dll文…

HarmonyOS—状态管理概述

在前文的描述中&#xff0c;我们构建的页面多为静态界面。如果希望构建一个动态的、有交互的界面&#xff0c;就需要引入“状态”的概念。 图1 效果图 上面的示例中&#xff0c;用户与应用程序的交互触发了文本状态变更&#xff0c;状态变更引起了UI渲染&#xff0c;UI从“He…

【OrangePi Zero2的系统移植】嵌入式Linux系统的组成、编译u-boot、编译内核、Linux根文件系统

一、嵌入式Linux系统的组成 二、编译u-boot 三、编译内核 四、Linux根文件系统 一、嵌入式Linux系统的组成 嵌入式Linux系统和PC完整的操作系统的对比如下&#xff1a; BIOS和UEFI的作用&#xff1a; a. 进行硬件自检&#xff0c;检测内存&#xff0c;CPU&#xff0c;显卡&a…

使用LlamaIndex和ChatGPT的无代码检索增强生成(RAG)

自从ChatGPT和类似的LLM推出以来&#xff0c;出现了大量的RAG工具和库。人们需要了解如何使用LlamaIndex和ChatGPT的无代码RAG。 检索增强生成(RAG)是使用大型语言模型(LLM)的关键工具。RAG使LLM能够将外部文档合并到它们的响应中&#xff0c;从而更紧密地与用户需求保持一致。…