算法 贪心4 || 860.柠檬水找零 406.根据身高重建队列 452. 用最少数量的箭引爆气球

news2025/5/20 3:07:06

860.柠檬水找零

很简单的一题,完全是常识题

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

406.根据身高重建队列

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

所以使用vector(动态数组)来insert,是费时的,插入再拷贝的话,单纯一个插入的操作就是O(n2)了,甚至可能拷贝好几次,就不止O(n^2)了。
在这里插入图片描述原vector中的size和capicity相同都是3,初始化为1 2 3,此时要push_back一个元素4。那么底层其实就要申请一个大小为6的普通数组,并且把原元素拷贝过去,释放原数组内存,注意图中底层数组的内存起始地址已经变了。同时也注意此时capicity和size的变化

而在贪心算法:根据身高重建队列
(opens new window)中,我们使用vector来做insert的操作,此时大家可会发现,虽然表面上复杂度是O(n2),但是其底层都不知道额外做了多少次全量拷贝了,所以算上vector的底层拷贝,整体时间复杂度可以认为是O(n^2 + t × n)级别的,t是底层拷贝的次数。

class Solution {
public:
    static bool cmp(vector<int> v1,vector<int> v2){
        if(v1[0] == v2[0]){
            return v1[1] < v2[1];
        }
        return v1[0] > v2[0];
    }
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(),people.end(),cmp);
        vector<vector<int>> res;
        for(int i = 0; i < people.size(); ++i){
            res.insert(res.begin() + people[i][1],people[i]);
        }
        return res;
    }

};

使用链表:

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. 用最少数量的箭引爆气球

之前写过,记得本题贪心思路,一遍过

class Solution {
public:
    static bool cmp(const vector<int>& v1,const vector<int>& v2){
        return v1[1] < v2[1];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        int count = 1;
        sort(points.begin(),points.end(),cmp);
        int temp = points[0][1];
        for(int i = 1; i < points.size(); i++){

            if(points[i][0] <= temp) continue;
            else{
                count++;
                temp = points[i][1];
            } 
        }
        return count;
    }
};

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

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

相关文章

【Linux】程序中获取和设置cpu和mem相关信息

这里是目录一、CPU和MEM信息1.1、CPU信息1.1.1、CPU核心数1.1.2、CPU频率读取和调整1.1.3、CPU温度1.2、MEM信息二、C程序读取CPU和MEM信息三、测试写在前面&#xff1a; 记录一下日常&#xff0c;之前有做过相关工作&#xff0c;但是没有记录下来&#xff0c;因此写一写文章。…

使用hbuilder连接夜神模拟器调试app

1. Hbuilder设置 这里端口号随便用一个没有被占用的&#xff1b; 路径夜神模拟器的安装路径下的nox_adb.exe的路径。 2. 夜神模拟器设置 设置如下&#xff1a; 工具&#xff0c;设置&#xff0c;关于平板电脑&#xff08;这里应该没有开发者模式选项&#xff0c;这是我配好之…

【LeetCode】剑指 Offer 53. 在排序数组中查找数字 p263 -- Java Version

1. 题目介绍&#xff08;53. 在排序数组中查找数字&#xff09; 面试题53&#xff1a;在排序数组中查找数字 一共分为三小题&#xff1a; 题目一&#xff1a;数字在排序数组中出现的次数题目二&#xff1a;0 ~ n-1 中缺失的数字题目三&#xff1a;数组中数值和下标相等的元素 2…

【创作赢红包】面向对象基础概念

什么是面向对象 面向对象&#xff08;Object Oriented&#xff09;是软件开发方法&#xff0c;一种编程范式&#xff0c;它是一种对现实世界理解和抽象的方法&#xff0c;是计算机编程技术发展到一定阶段后的产物。 早期的计算机编程是基于面向过程的方法&#xff0c;如实现算…

前端工程化:环境准备—NodeJs安装-Vue项目开发流程

一、前端工程化-Yapi 介绍&#xff1a;YApi 是高效、易用、功能强大的 api 管理平台&#xff0c;旨在为开发、产品、测试人员提供更优雅的接口管理服务 地址&#xff1a; http://yapi.smart-xwork.cn/ 具体操作步骤&#xff1a; 1、添加项目 2、添加接口&#xff1a;根据ID查…

技术分享 | observer 资源水位介绍

作者&#xff1a;郭斌斌 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 OceanBase 集群界面会展示 Observer …

MATLAB绘制柱状/饼图填充图

MATLAB绘制柱状填充图方法1&#xff1a;hatchfill2工具1.1 案例1&#xff1a;柱状图填充1.2 案例2&#xff1a;饼图填充方法2&#xff1a;applyhatch函数2.1 案例1&#xff1a;柱状图填充2.2 案例2&#xff1a;饼图填充方法3&#xff1a; applyhatch_plusC函数3.1 案例1&#x…

Python 小型项目大全 31~35

三十一、猜数字 原文&#xff1a;http://inventwithpython.com/bigbookpython/project31.html 猜数字是初学者练习基本编程技术的经典游戏。在这个游戏中&#xff0c;电脑会想到一个介于 1 到 100 之间的随机数。玩家有 10 次机会猜出数字。每次猜中后&#xff0c;电脑会告诉玩…

Java实现ArrayList和底层源码讲解

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Centos7安装MySQL5.7.30

文章目录1. 环境准备1.1 卸载mariadb1.2 下载MySQL 5.7.301.3 安装MySQL依赖项1.4 创建目录1.5 创建用户和用户组1.6 修改Mysql用户权限2. 安装MySQL2.1 解压2.2 修改解压目录名称2.3 初始化2.4 添加my.cnf异常找不到Sock文件2.5 启动MySQL服务2.5.1 建立软连接2.5.2 启动2.6 设…

TCP协议工作机制二(滑动窗口,流量控制,拥塞控制,延时应答,捎带应答等)

目录 滑动窗口 流量控制 拥塞控制 延时应答 捎带应答 面向字节流 异常情况 UDP和TCP对比 滑动窗口 由于TCP是可靠传输,有确认应答,超时重传,连接管理等机制,发送消息时需要等待接收方返回的ack.因此会消耗大量等待ack的时间,我们引入滑动窗口的机制来竭尽可能提高TCP的…

基于支持向量机的Digits手写数字识别

基于支持向量机的Digits手写数字识别 描述 支持向量机&#xff08;Support Vector Machine&#xff0c;简称SVM&#xff09;模型既可以用于分类也可以用于回归。手写数字识别是一个多分类问题&#xff08;判断一张手写数字图片是0~9中的哪一个&#xff09;&#xff0c;数据集…

图片英文翻译成中文转换器-中文翻译英文软件

您正在准备一份重要的英文资料或文件&#xff0c;但是您还不是很熟练地掌握英文&#xff0c;需要翻译才能完成您的任务吗&#xff1f;哪个软件能够免费把英文文档翻译成中文&#xff1f;让我们带您了解如何使用我们的翻译软件来免费翻译英文文档为中文。 我们的翻译软件是一款功…

C风格的字符串赋值方式

文章目录&#xff08;1&#xff09;C语言中&#xff0c;没有字符串类型但可以用字符数组模拟字符串。&#xff08;2&#xff09;C语言中&#xff0c;字符串是以’\0’作结尾字符。&#xff08;3&#xff09;C语言中&#xff0c;字符串常量本质上是一个无名的字符数组。C风格的字…

使用Spring JDBC中的JdbcTemplate对数据进行增删改查操作教程~

jdbcTemplate实现添加数据功能&#xff1a; spring框架对jdbc框架进行封装&#xff0c;使用jdbcTemplate方便实现对数据库的操作 数据库准备工作&#xff1a; 在已有数据库中创建新的表&#xff1a; create table t_user (id int,username varchar(20),password varchar(20…

搜索词分析工具-网站关键词挖掘

怎么能找到行业的关键词 以下是如何找到行业关键词的建议&#xff1a; 了解行业&#xff1a;要找到与行业相关的关键词&#xff0c;首先需要了解行业。了解行业以及核心目标&#xff0c;从而更好地理解行业中的主题和词汇。 找到竞争对手网站&#xff1a;搜索竞争对手的网站&…

k8s部署Dashboard

k8s和Dashboard的版本对应关系可以到Dashbord的对应版本里看&#xff0c;比如这里&#xff1a; https://github.com/kubernetes/dashboard/releases/tag/v2.7.0 以下步骤都是在master上执行的。 1. 部署步骤 1. 获取Dashbord的yaml文件 wget https://raw.githubusercontent…

【Git】—— 如何安装Git及简单使用

Git是一个开源的分布式版本控制工具&#xff0c;可以更好地管理你的项目。 一、Linux操作系统 如果用的是Ubuntu系统&#xff0c;只需打开shell界面&#xff0c;输入&#xff1a; sudo apt-get install git-core 按下回车即可完成安装。 二、Windows操作系统 Windows操作系统不…

C语言-数据结构与算法-详细全面的链表知识总结归纳

C语言链式存储结构的详细讲解一.前言(为什么要使用链式存储)一.单链表1.单链表的结点描述2.单链表基本操作(1)初始化单链表(2)采用头插法建立单链表(带头结点)(3).采用尾插法建立单链表(4)按照位序查找结点(4)在链表中间插入结点(5)删除第i个结点二.双链表1.双链表的结点类型描…

和ChatGPT-4聊完后,我觉得一切可能已经来不及了

了然无味&#xff0c;晴空万里&#xff01;和ChatGPT-4开始了一场坦诚的沟通&#xff0c;它全程都表现出高情商&#xff0c;以及不断尽量安抚我的情绪&#xff0c;而这&#xff0c;恰恰令我脊背发凉。 部分文字截取 ZM&#xff1a;我能不能理解每次对话就是一次你的“生命” G&…