【算法练习Day29】柠檬水找零根据身高重建队列用最少数量的箭引爆气球

news2024/10/7 12:27:41

在这里插入图片描述

​📝个人主页:@Sherry的成长之路
🏠学习社区:Sherry的成长之路(个人社区)
📖专栏链接:练题
🎯长路漫漫浩浩,万事皆有期待

文章目录

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

柠檬水找零

860. 柠檬水找零 - 力扣(LeetCode)

每一杯柠檬水5块钱,能收到的面额只有5,10和20三种金额的钱币。一开始我没有记录怎么找零,将三者都化为了自己得到了多少钱,然后判断是否能找零。后来发现不对劲,必须要记录下来你获得的钱币各面额的都是多少,但是实际上20元的钱我们可以不做记录,因为20块钱的一张纸币,找不了钱,最大人家就给20块钱,而五块钱和十块钱能找开10块钱和20块钱的,我们需要将它们分别记录下来,一共有多少张。如何存钱的思路明确了,就好办了,每次遇到需要找钱的时候我们判断一下,有没有零钱,就可以了。

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int target=0;
        map<int,int>hash_map;
        for(int i=0;i<bills.size();i++){
           if(bills[i]==5)hash_map[5]++;
           else if(bills[i]==10)hash_map[10]++;
           target=bills[i]-5;
            if(target==5){
                if(hash_map[5])hash_map[5]--;
                else return false;
            }
            else if(target==15){
                if(hash_map[10]&&hash_map[5]){
                    hash_map[10]--;hash_map[5]--;
                }
                else if(hash_map[5]>=3){
                    hash_map[5]-=3;
                }
                else return false;
            }
        }
        return true;
    }
};

这里我用了数组vecor来存储,五元钱和十元钱都获得了几张,并且需要注意的是如果我们碰到20元需要找15的时候,应该尽量使用先看有没有10元纸币的策略,如果没有再找三个五元,因为十元只能找开20元,要合理使用,避免找10元时候5元不够。

当然了,为了提高效率,我们可以在存储纸币有多少的时候,用整形int来代替,也是可以的。

根据身高重建队列

406. 根据身高重建队列 - 力扣(LeetCode)

这道题的排序部分和上一期的分发糖果差不多的思路,上一个题只不过不是那么明确,但是这道题明确的给出了两个不同属性的值,我们要根据两个不同属性的值来对数据进行排序。上一个题是当前分发糖果的孩子可能要同时比较左孩子和右孩子的分数,再进行排序调整,所以理论上也都是两次排序。

思路是这样的,我们先按照身高排序,如果先按照前面有几个数的k排序,是不对的,因为k的值是固定的,题的言外之意是,我们先确定好身高后,排序k看前面有几个数据,而不能先排序k,这样会造成两个属性都没办法合理排序,浪费时间。我们先按照身高进行排序,排降序把身高高的排在数组的前面,然后再按照第二个属性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) {
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>>result;
        for(int i=0;i<people.size();i++){
            int pos=people[i][1];
            result.insert(result.begin()+pos,people[i]);
        }
        return result;
    }
};

我们再进行第一个属性的排序时候,先不把数据整个压到数组内部,先对其进行排序,因为什么不像那道分发糖果一样直接放入数组然后用++来调整呢,因为我们要返回的这个数组里面包含多个数组,我们在进行第一步排列时候就将内容加到返回数组里了,在第二次排序调整的时候,数据很难再从结果数组里进行排序了,因为我们每次排序的是一个数组。正确的做法是,第一次按照身高排完序后,第二次排序的时候确定了,再压入数组中,实际上这里的第二次排序是很有讲究的,第一次排序的时候我们已经按照数据排了对身高的降序,这个时候我们再用一个变量来保存它这个当前值的k值,它决定了我们这个数组插入到哪个位置。

我们首先将如果数据一样,k值小的排在了前面,所以一般来说第一个数据就是插在0这个位置上的,以此类推都是根据k值来调整插入的顺序,而为什么要先排序大的数据呢?因为我们先将身高大的数据插进去了,这样我们身高小的数据插入时候,会把身高大的数据向后面挤(当身高小的数据k值也小的时候),身高大的前面有身高小的是没有任何问题的(当身高大的前面有0个人时,或前面有比他大的身高)所以我们才进行这样的排序,如果身高小的数据k值也小的话,那它自然就插入到后面了,这个是很容易理解的。

总的来说,思路听巧妙的,但是用数组做存储并不方便,会增加运行的负担,vector的插入函数运行效率不高,而且vector底层是数组实现,如果要插入数据过大,它要开辟一个两倍于当前大小,然后将数据拷贝进来再操作,如果它总是拷贝会大大影响效率。

我们可以将其改为用链表来操作,将数据用链表连接保存,然后返回时候再化为数组。

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) {
        sort(people.begin(),people.end(),cmp);
        list<vector<int>>result;
        for(int i=0;i<people.size();i++){
            int pos=people[i][1];
            list<vector<int>>::iterator it=result.begin();
            while(pos--)it++;
            result.insert(it,people[i]);
        }
        return vector<vector<int>>(result.begin(),result.end());
    }
};

注意:这里的it并不是多此一举,c++里的list的insert函数并不是随机迭代访问器,不能像操作数组那样加加减减的,我们需要调整迭代器的位置之后,再进行传入。

用最少数量的箭引爆气球

452. 用最少数量的箭引爆气球 - 力扣(LeetCode)

贪心算法中的重叠问题,两个气球都有其所在的范围,也就是所谓的直径,将两个气球放在一个x,y的平面上,如果两个气球x部分有重叠,那么一支箭就可以射爆两个气球,题目给出箭从x轴垂直向上射出,可以无限距离的走,也就是说路径上只要有气球都可以射爆,需要注意的一点是,如果两个气球的边界是紧挨着的,那么一支箭从两气球中间穿过去,也就是边界处,也是可以将两个气球同时射爆的。

解题思路:如何判断两气球是否有重叠部分?第二个气球的最左端的坐标如果小于第一个气球的最右端,说明存在重叠部分,即使等于也可以这就是上面所说的紧挨着的情况,但是如果大于了则说明没有重叠部分需要另一只箭,值得注意的是如果有两气球重叠判断第三只气球也是否可以一起射爆的时候,我们需要判断的有可能不再是第一个气球的末尾处,有可能是第二个气球的末尾处,由于前两个气球已经重叠,可以看作一个整体,如果第二个气球过小,完全被第一个气球所包含,那么我们下一次的判断边界应该是两气球中的较小的那一个下标,来缩小其范围,如果这时候还用第一个下标那么就可能出现射爆一三气球,而射不到第二个气球的情况,这一点需要额外注意。

class Solution {
public:
static bool cmp(vector<int>&a,vector<int>&b){
    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])
            result++;
            else points[i][1]=min(points[i-1][1],points[i][1]);
        }
        return result;
    }
};

代码还算简单,但是思路很难在没有做过的时候想出来。

写判断标准的cmp时候,一定要传入数组引用,不要只单独传入数组,因为数组过大的时候,直接传入它需要先对数组整个进行复制传入,很费时。

为什么要先将数组排序后再做处理呢?这是为了方便寻找区间重叠,让可能重叠的区间挨在一起。

总结:

今天我们完成了柠檬水找零、根据身高重建队列、用最少数量的箭引爆气球三道题,相关的思想需要多复习回顾。接下来,我们继续进行算法练习。希望我的文章和讲解能对大家的学习提供一些帮助。

当然,本文仍有许多不足之处,欢迎各位小伙伴们随时私信交流、批评指正!我们下期见~

在这里插入图片描述

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

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

相关文章

2.8每日一题(定积分比较大小)

在对称区间上的定积分比较大小&#xff0c;首先考虑积偶性&#xff1a;对称区间上被积函数如果是奇函数&#xff0c;则定积分值为0&#xff0c;如果被积函数为偶函数&#xff0c;则定积分值为2倍一般区间的定积分。

通付盾APP尽职调查报告深度解析

引言&#xff1a; ​移动应用程序已经成为了现代生活的重要组成部分&#xff0c;我们几乎每天都在使用各种不同类型的应用来满足我们的需求&#xff0c;无论是社交、购物、娱乐还是工作。然而&#xff0c;随着移动应用的广泛使用&#xff0c;APP及供应链安全问题也引起了越来越…

第十六章总结:反射和注解

.1.1&#xff1a;访问构造方法 反射&#xff1a; 1.class类 2.获取构造方法 3.获取成员属性 4.获取成员方法 注解 1.内置注解 2.反射注解 3 创建Class对象的三种方式 1.使用getClass&#xff08;&#xff09;方法 object str new object&#xff08;&#xff09;…

CVE-2021-41773/42013 apache路径穿越漏洞

影响范围 CVE-2021-41773 Apache HTTP server 2.4.49 CVE-2021-42013 Apache HTTP server 2.4.49/2.4.50 漏洞原理 Apache HTTP Server 2.4.49版本使用的ap_normalize_path函数在对路径参数进行规范化时会先进行url解码&#xff0c;然后判断是否存在…/的路径穿越符&#xf…

Python语言:字典的使用

字典是一种存储无序的可以修改内容的的容器。 字典的具体含义&#xff1a; 现实生活中的字典是通过检索到一个字从而找到它所对应的的含义&#xff0c;字和字的含义是互相对应的&#xff0c;python世界里的字典和这个字典的用法类似&#xff0c;字典是由kye和相对应的value构成…

Stable Diffusion 图生图+ControlNet list index out of range

在webui1.5中用图生图ControlNet批量处理图片的时候报错&#xff1a; controlnet indexError: list index out of range 解决方法&#xff1a; 在controlNet的设置页中勾选不输出检测图即可。 参考&#xff1a;https://github.com/AUTOMATIC1111/stable-diffusion-webui/issu…

jdk1.8批量完成部署

第一步&#xff1a;源主机配置 在源主机上面上传jdk的文件包 获取jdk1.8https://download.csdn.net/download/weixin_44680802/88467044 添加java环境变量配置 export JAVA_HOME/usr/local/java/jdk1.8.0_65 export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOM…

今年暑假不AC(贪心思路)

这道题是一道贪心算法的经典问题&#xff08;活动选择问题&#xff09; 先说用到的贪心结论&#xff1a;最先结束的活动一定是最优解的一部分 证明过程如下&#xff1a; 假设a是所有活动中最先结束的活动&#xff0c;b是最优解中最先结束的活动 如果ab 则结论成立 如果a!b 则b…

拓扑排序代码模板

一些注意的点都在代码注释中了。 //有向图无环图中才有拓扑排序&#xff0c;且都是前面的编号的点指向后面编号的点 #include<iostream> #include<cstring> using namespace std; const int N 1e5 9; int e[N], ne[N], h[N], idx, n, m, d[N], q[N];void add(in…

Linux多线程【生产者消费者模型】

✨个人主页&#xff1a; 北 海 &#x1f389;所属专栏&#xff1a; Linux学习之旅 &#x1f383;操作环境&#xff1a; CentOS 7.6 腾讯云远程服务器 文章目录 &#x1f307;前言&#x1f3d9;️正文1、生产者消费者模型1.1、什么是生产者消费者模型&#xff1f;1.2、生产者消费…

MySQL 连接出现 Authentication plugin ‘caching_sha2_password的处理方法(使用第二种)

出现这个原因是mysql8 之前的版本中加密规则是mysql_native_password,而在mysql8之后,加密规则是caching_sha2_password, 解决问题方法有两种,一种是升级navicat驱动,一种是把mysql用户登录密码加密规则还原成mysql_native_password. 1. 升级MySQL版本 较早的MySQL版本可能不…

澳大利亚专线现在成熟吗?

在全球化的大背景下&#xff0c;物流运输的重要性日益凸显。其中&#xff0c;澳大利亚专线作为一条连接中国与澳大利亚的物流通道&#xff0c;近年来引起了广泛的关注。那么&#xff0c;这样的物流专线在当前环境下是否已经成熟呢?我们将在接下来的文字中一一进行探讨。 首先&…

11.读取文件长度-fseek和ftell函数的使用

文章目录 简介1. 写入测试文件2. 读取文件长度 简介 主要讲使用fopen读取文件&#xff0c;配合使用fseek和ftell来读取文件长度。1. 写入测试文件 执行下方程序&#xff0c;使用fwrite函数写入40字节的数据&#xff0c;使其形成文件存入本地目录。#define _CRT_SECURE_NO_WARNI…

代码审计及示例

简介&#xff1a; 代码安全测试是从安全的角度对代码进行的安全测试评估。 结合丰富的安全知识、编程经验、测试技术&#xff0c;利用静态分析和人工审核的方法寻找代码在架构和编码上的安全缺陷&#xff0c;在代码形成软件产品前将业务软件的安全风险降到最低。 方法&#x…

【蓝桥每日一题]-贪心(保姆级教程 篇2)#纪念品分组 #gcd排序

目录 题目&#xff1a;纪念品分组 思路&#xff1a; 题目&#xff1a;gcd排序 思路&#xff1a; 题目&#xff1a;纪念品分组 思路&#xff1a; 贪心思路&#xff1a;先将数据从小到大排序&#xff08;默认&#xff09;&#xff0c;然后让最左边l和最右边r匹配&#xff0c;…

【QT】点击按钮弹出对话框的注意实现

在stack区创建对话框对象 模态对话框&#xff0c;不可以对其他窗口进行操作。 模态窗口用dlg.exec()显示窗口。 问题代码1: MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow) {ui->setupUi(this);//点击新建按钮&#xff0c;弹出一…

华为eNSP配置专题-IPSec的配置

文章目录 华为eNSP配置专题-IPSec的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、IPSec的配置3.1、通过ACL定义需要保护的数据流3.2、配置IPSec安全提议3.3、配置IPSec手动方式安全策略3.3.1、在R1上配置3…

05.大模型大数据量

文章目录 大模型顿悟时刻&#xff1a;Emergent Ability&#xff08;涌动现象&#xff09;Calibration Inverse Scaling PrizeSwitch Transformers 大数据量数据预处理去重 模型大小与训练数据的选择Instruction-tuningHuman TeachingKNN LM 部分截图来自原课程视频《2023李宏毅…

Java流(Stream)式编程

流式编程 Stream作为Java 8的一大亮点&#xff0c;它专门针对集合的各种操作提供各种非常便利&#xff0c;简单&#xff0c;高效的API,Stream API主要是通过Lambda表达式完成&#xff0c;极大的提高了程序的效率和可读性。 流式编程的概念基于函数式编程的思想&#xff0c;旨…

Linux云服务器限制ip进行ssh远程连接

对Linux云服务器限制IP进行SSH远程连接的原因主要有以下几点&#xff1a; 增加安全性&#xff1a;SSH是一种加密的网络传输协议&#xff0c;可以保护数据的机密性和完整性。通过限制SSH连接的IP地址&#xff0c;可以防止未经授权的访问和数据泄露。只有拥有访问权限的IP地址才…