代码随想录算法训练营day34

news2024/12/23 13:17:52

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

参考链接:代码随想录

860.柠檬水找零

思路:本题思路比较容易想,主要对于5,10,20三种情况分别讨论,维护三个变量分别记录目前手中三种钞票的数量。bill为5的时候直接收下即可,10的时候,,找零一个5,这两种情况都是固定的。只有遇到20的时候,我们优先使用10来找零,因为5更加万能,只有没有10的时候我们才会找零三张5。**注意顾客排队顺序,必须一个个处理,不能先收后面的钱再整体找零!**时间复杂度O(n)。

class Solution {
public:
    bool lemonadeChange(vector<int>& bills) {
        int five=0,ten=0,twenty=0;
        for(int bill:bills){
            if(bill==5){
                five++;
            }
            else if(bill==10){
                if(five<=0){
                    return false;
                }
                else{
                    five--;
                    ten++;
                }
            }
            else{
                if(ten>0){
                    ten--;
                    twenty++;
                    if(five>0){
                        five--;
                    }
                    else{
                        return false;
                    }
                }
                else{
                    if(five<3){
                        return false;
                    }
                    else{
                        five-=3;
                        twenty++;
                    }
                }
            }
        }
        return true;
    }
};

本题实际上就是顺着正常收钱的思路思考就行,只有找零20的时候是贪心。看标答还可以稍微简化一下:

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.根据身高重建队列

思路:本题想了很久没有思路,直接看解答。**本题的队列不是单独按照身高排的,而是预先按照一个固定顺序排好的队列,然后根据h求出对应的k,再将其打乱即为本题的输入。**本题的排序,需要同时考虑k和h,有两个维度,如果先考虑k,排好后没有一个维护确定下来,故先考虑h,根据身高先从大到小排(因为k是求的前面比自己大于等于的身高数量),如果h相同则将k小的放在前面。这样初步排好后,前面的必定比后面高,然后再根据k为下标重新插入队列即可,这样后续插入的节点也不会影响队列,如图所示。时间复杂度O(nlogn+n^2)。
在这里插入图片描述
关键点就在根据k为下标插入时,由于前面的h一定比后面大,在插入时,下标恰好就是前面比后面大的个数,这样就完成了复原。
在这里插入图片描述

class Solution {
public:
    static bool cmp(vector<int>& v1,vector<int>& v2){//初步排序
        if(v1[0]==v2[0]) return v1[1]<v2[1];//身高相同k小的排前面
        return v1[0]>v2[0];//身高从高到低
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>> ans;
        for(auto v:people){
            ans.insert(ans.begin()+v[1],v);//在位置k处插入,insert的时间复杂度为O(n)
        }
        return ans;
    }
};

时间复杂度主要用于insert,这里如果使用链表list会快很多。但是我没用过list,正常就用链表就OK了。

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

思路:贪心思路就是一开始就射重复最多的气球,举反例没有一开始少射还能用箭最少的,故本题满足局部最优即为全局最优。主要在于实现的时候,如何用代码写出气球重合,气球射爆的过程?首先排序,这里使用起始位置排序,后面射的时候就从左往右遍历。遇到重复气球,那么重叠气球中最右边界的最小值一定需要一个箭,如图所示。
在这里插入图片描述
代码的核心就是当气球重叠时,需要更新重叠气球的最小右边界。当下一个气球的左边界大于上一个气球(上一组重合气球)的最小右边界时,即不相交,这时需要额外增加一个箭。时间复杂度O(nlogn)。

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;
    }
};

本题就难在写代码的过程。

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

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

相关文章

P450焕新而来,室内外两用+路径规划+YOLO点击跟踪,算力高达100TOPS

Prometheus 450&#xff08;简称P450&#xff09;是一款室内室外两用的中型轴距&#xff08;410mm&#xff09;无人机&#xff0c;基于F450基础飞行平台&#xff0c;搭载感知传感器二维平面激光雷达&#xff0c;双目深度相机等&#xff0c;配合软件Prometheus自主无人机系统和S…

GitOps 和 DevOps 有什么区别?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

OpenStack 入门体验

目录 一、云计算概述 1.1、什么是云计算 1.2、云计算的服务模型 1&#xff09;IaaS 2&#xff09;PaaS 3&#xff09;SaaS 1.3、OpenStack 概述 1&#xff09;OpenStack 起源 2&#xff09;什么是 OpenStack 3&#xff09;OpenStack 优势 二、OpenStack 一…

【1569】jsp学生学籍管理系统Myeclipse开发sqlserver数据库web结构jsp编程计算机网页项目

一、源码特点 jsp 学生学籍管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为sqlserver2…

RuoYi-Vue-Plus ()

一、SaInterceptor 注解鉴权和路由拦截鉴权 拦截器&#xff1a;SaInterceptor 实现类位置&#xff1a; cn.dev33.satoken.interceptor.SaInterceptor 功能&#xff1a;Sa-Token 综合拦截器&#xff0c;提供注解鉴权和路由拦截鉴权能力 /*** 创建一个 Sa-Token 综合拦截器&…

2024年新材料与化学工程国际学术会议(ICNMCE 2024)

2024年新材料与化学工程国际学术会议(ICNMCE 2024) 2024 International Conference on New Materials and Chemical Engineering 一、【会议简介】 2024年新材料与化学工程国际学术会议&#xff0c;将汇集全球顶尖学者&#xff0c;展开一场学术盛宴。 在这次会议上&#xff0c…

Git禁止松散对象loose objects弹窗

打开仓库时&#xff0c;弹窗如图 This repository currently has approximately XXXX loose objects.解决办法&#xff1a;见How to skip “Loose Object” popup when running ‘git gui’ Git v1.7.9 或以上版本&#xff0c;执行git config --global gui.gcwarning false

IDEA更换新版本启动没反应

目前安装了新的IDEA(压缩包方式)&#xff0c;由于老版本的IDEA还在用&#xff0c;所以并没有删除&#xff0c;但是安装完后发现点击idea64.exe后没有反应&#xff0c;于是网上找了好多方法最后解决了 下面是我的解决过程 新版本&#xff1a;IntelliJIdea2024.1 老版本: Intelli…

使用matlab/C语言/verilog分别生成coe文件

之前已经写过一个如何使用matlab生成coe文件&#xff0c;matlab自行运算生成三角波、正弦波等数据&#xff0c;并保存为COE文件。可跳转下面的网址进行查阅。 使用matlab生成正弦波、三角波、方波的COE文件_三角波文件.coe-CSDN博客https://blog.csdn.net/yindq1220/article/d…

如何自动监控WordPress网站的运行状态

近来有不少Hostease的客户来咨询关于监控网站在线情况的方法&#xff0c;确实&#xff0c;尽管我们采取了各方面的措施来维护和保护WordPress网站&#xff0c;网站依然有可能由于一些不可控的原因关闭&#xff0c;这种情况往往事发突然&#xff0c;如果没有提前做好准备&#x…

FloodFill算法简介(用BFS、DFS算法解决)

FloodFill算法中文名&#xff1a;洪水灌溉 FloodFill通常是这样一类问题&#xff0c;如下图&#xff1a; 负数表示凹陷的土地&#xff0c;正数表示凸起的土地&#xff0c;发洪水/下雨会淹没凹陷的地方 通常会问这几种问题&#xff1a; 1.被淹没的区域有几块 2.被淹没的最大…

嵌入式物联网开发基石

前言 嵌入式物联网开发工程师&#xff0c;是一个蓝海新风口&#xff0c;高薪不内卷的行业。需要掌握熟悉c/c、单片机、数据结构&#xff0c;linux系统&#xff0c;ARM单片机&#xff0c;嵌入式。可以从事工作项目loT、视频监控领域的产品&#xff0c;跨平台系统&#xff0c;智能…

联想拯救者电脑数据恢复方法,适用于未备份者

自从大学时期起&#xff0c;我的联想拯救者电脑就成为了我生活和学习的得力助手&#xff0c;里面存有许多至关重要的资料。但是昨日当我启动它时&#xff0c;电脑却意外卡顿。恢复正常后&#xff0c;发现部分数据竟然神秘地消失了&#xff0c;有什么方法能帮我恢复吗&#xff1…

快速上手Jemter分布式压测实战和代码详细解析

&#x1f680; 作者 &#xff1a;“二当家-小D” &#x1f680; 博主简介&#xff1a;⭐前荔枝FM架构师、阿里资深工程师||曾任职于阿里巴巴担任多个项目负责人&#xff0c;8年开发架构经验&#xff0c;精通java,擅长分布式高并发架构,自动化压力测试&#xff0c;微服务容器化k…

2025考研数学武忠祥强化班视频,百度网盘课程+讲义PDF更新

25考研的小伙伴们现在应该基础都学习的差不多了吧&#xff01; 是时候进入强化阶段的学习啦。 2025考研数学强化班全程网盘&#xff1a;https://pan.baidu.com/s/1Z029fuCLkyyhIRFqd5QKcg 提取码&#xff1a;p3ue 晚上好&#xff0c;聊聊17堂课的看课攻略。 今年的17堂课还…

BUUCTF——[GXYCTF2019]BabyUpload

BUUCTF——[GXYCTF2019]BabyUpload 1.上传嘛&#xff0c;直接丢正常的jpg文件进服务器 2.发现可以正常上传&#xff0c;并且回显出来啦文件上传的路径 /var/www/html/upload/7df22610744ec51e9cb7a8a8eb674374/1111.jpg 3.尝试上传一句话木马 <?php eval($POST[123456]…

如何使用ChatGPT仿写一篇学术论文

点击下方▼▼▼▼链接直达AIPaperPass &#xff01; AIPaperPass - AI论文写作指导平台 目录 1.仿写的目的 2.根据专业方向搜集合适的文献 3.总结想要仿写的文献 4.使用ChatGPT一步一步仿写 5.书籍介绍 AIPaperPass智能论文写作平台 深入地阅读和分析你研究领域的相关文…

小游戏贪吃蛇的实现之C语言版

找往期文章包括但不限于本期文章中不懂的知识点&#xff1a; 个人主页&#xff1a;我要学编程(ಥ_ಥ)-CSDN博客 所属专栏&#xff1a;C语言 目录 游戏前期准备&#xff1a; 设置控制台相关的信息 GetStdHandle GetConsoleCursorInfo SetConsoleCursorInfo SetConsoleCu…

Ansible 指定受控端使用Python的版本

最近在装Ansible&#xff0c;有一台受控端Ubuntu16的服务器&#xff0c;安装了Python2.7.12和Pyhon3.5。当用Ansible连接它时&#xff0c;显示使用的是Python3.5。最后看文档&#xff0c;发现Ansible可以在hosts的文件中指定受控服上运行的Python。 现象 受控端 查看Python版…

这些小众工作软件让你事半功倍

大家好呀&#xff01;&#x1f44b; 今天我要来种草一些不那么主流&#xff0c;但却能大大提升你工作效率的神器软件&#xff01;&#x1f31f; 如果你也像我一样&#xff0c;对那些大众化的工作工具已经审美疲劳&#xff0c;那么快来一起探索这些隐藏的宝藏吧&#xff01;&…