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

文章目录

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


1.柠檬水找零

在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。

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

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

给你一个整数数组 bills,其中 bills[i] 是第 i 位顾客付的账。如果你能给每位顾客正确找零,返回 true,否则返回 false

示例 1:

  • 输入:bills = [5,5,5,10,20]
  • 输出:true
  • 解释:
    前 3 位顾客那里,我们按顺序收取 3 张 5 美元的钞票。
    第 4 位顾客那里,我们收取一张 10 美元的钞票,并返还 5 美元。
    第 5 位顾客那里,我们找还一张 10 美元的钞票和一张 5 美元的钞票。
    由于所有客户都得到了正确的找零,所以我们输出 true。

示例 2:

  • 输入:bills = [5,5,10,10,20]
  • 输出:false
  • 解释:
    前 2 位顾客那里,我们按顺序收取 2 张 5 美元的钞票。
    对于接下来的 2 位顾客,我们收取一张 10 美元的钞票,然后返还 5 美元。
    对于最后一位顾客,我们无法退回 15 美元,因为我们现在只有两张 10 美元的钞票。
    由于不是每位顾客都得到了正确的找零,所以答案是 false。

提示:

  • 1 <= bills.length <= 10^5
  • bills[i] 不是 5 就是 10 或是 20

只需要维护三种金额的数量5 10 20

  1. 情况一: 账单是5,直接收下。
  2. 情况二: 账单是10,消耗一个5,增加一个10
  3. 情况三: 账单是20,优先消耗一个10和一个5,如果不够,再消耗三个5

代码如下:

class Solution {
private:static bool cmp(vector<int>& a, 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;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;}
};

2.根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi,前面正好有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

示例 1:

  • 输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
  • 输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]
  • 解释:
    • 编号为 0 的人身高为 5,没有身高更高或者相同的人排在他前面。
    • 编号为 1 的人身高为 7,没有身高更高或者相同的人排在他前面。
    • 编号为 2 的人身高为 5,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。
    • 编号为 3 的人身高为 6,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
    • 编号为 4 的人身高为 4,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。
    • 编号为 5 的人身高为 7,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。
      因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。

示例 2:

  • 输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]
  • 输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]

提示:

  • 1 <= people.length <= 2000
  • 0 <= hi <= 10^6
  • 0 <= ki < people.length
  • 题目数据确保队列可以被重建

有两个维度权衡,需要先确定一个维度,再确定另一个,我们可以先用身高排序,然后按照k为下标重新插入排序
代码如下

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

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

有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points,其中 points[i] = [xstart, xend] 表示水平直径在 xstartxend 之间的气球。你不知道气球的确切 y 坐标。

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

给你一个数组 points,返回引爆所有气球所必须射出的最小弓箭数。

示例 1:

  • 输入:points = [[10,16],[2,8],[1,6],[7,12]]
  • 输出:2
  • 解释:气球可以用2支箭来爆破:
    • x = 6 处射出箭,击破气球 [2,8][1,6]
    • x = 11 处发射箭,击破气球 [10,16][7,12]

示例 2:

  • 输入:points = [[1,2],[3,4],[5,6],[7,8]]
  • 输出:4
  • 解释:每个气球需要射出一支箭,总共需要4支箭。

示例 3:

  • 输入:points = [[1,2],[2,3],[3,4],[4,5]]
  • 输出:2
  • 解释:气球可以用2支箭来爆破:
    • x = 2 处发射箭,击破气球 [1,2][2,3]
    • x = 4 处射出箭,击破气球 [3,4][4,5]

提示:

  • 1 <= points.length <= 10^5
  • points[i].length == 2
  • -2^31 <= xstart < xend <= 2^31 - 1

局部最优: 当气球出现重叠,一起射,所用弓箭最少。全局最优: 把所有气球射爆所用弓箭最少。
为了让气球尽可能的重叠,需要对数组进行排序。可以先对右边界进行排序。然后用第一个右边界第二个左边界比较,第一个右边界大与第二个左边界则重叠,此时可以少射一只箭count++。再次用第一个右边界第三个左边界比较,若此时第一个右边界小于第三个左边界,则此时更新右边界为第三个边界的右边界。

在这里插入图片描述

代码如下

class Solution {
private:static bool cmp(vector<int>& a, 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;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;}
};

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

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

相关文章

【Photoshop2020版本】零基础笔记(一)

哈喽大家好~最近博客内容换方向了哈哈哈~换成“实用版”了。 今天给大家带来的是 PS 相关内容 其实我也是刚学PS&#xff0c;所以想着自己做笔记还不如发布出去&#xff0c;让大家都能看到&#xff0c;有兴趣的伙伴们&#xff0c;可以跟着我的笔记一块学习&#xff0c;这个专…

操作系统(笔记)(一)

1、操作系统的功能和目标 1.1功能 存储管理文件管理设备管理处理机管理进程管理 1.2目标 方便性&#xff1a;操作系统作为用户与计算机硬件系统之间的接口&#xff0c;提供了直观的命令和界面&#xff0c;使得用户能够更容易地操作计算机。有效性&#xff1a;操作系统旨在提…

将ppt里的视频导出来

将ppt的后缀从pptx改为zip 找到【media】里面有存放图片和音频以及视频&#xff0c;看文件名后缀可以找到&#xff0c;mp4的即为视频&#xff0c;直接复制粘贴到桌面即可。 关闭压缩软件把ppt后缀改回&#xff0c;不影响ppt正常使用。

【论文阅读】Mamba:选择状态空间模型的线性时间序列建模(二)

文章目录 3.4 一个简化的SSM结构3.5 选择机制的性质3.5.1 和门控机制的联系3.5.2 选择机制的解释 3.6 额外的模型细节A 讨论&#xff1a;选择机制C 选择SSM的机制 Mamba论文 第一部分 Mamba:选择状态空间模型的线性时间序列建模(一) 3.4 一个简化的SSM结构 如同结构SSM&#…

【笔记】ArkTS 语言(OpenHarmony系统)

一、官方简介和文档 介绍&#xff1a;aArkTS 语言 | 华为开发者联盟 (huawei.com) 学习指南&#xff08;文档&#xff09;&#xff1a;初识ArkTS语言-学习ArkTS语言-入门 | 华为开发者联盟 (huawei.com) 二、ArkTS语言知识 &#xff08;一&#xff09;编程语言介绍 Mozilla创…

对象变更记录objectlog工具(持续跟新)

文章目录 前言演示代码演示环境引入项目项目框架操作步骤 设计介绍参考仓库 前言 系统基于mybatis-plus, springboot环境 对于重要的一些数据&#xff0c;我们需要记录一条记录的所有版本变化过程&#xff0c;做到持续追踪&#xff0c;为后续问题追踪提供思路。下面展示预期效果…

蓝牙系列一:初识蓝牙

早就对蓝牙的知识垂涎已久&#xff0c;由于各种原因都没能系统的好好的学习一下&#xff08;最大的原因就是自己太懒了&#xff01;&#xff01;&#xff09;&#xff0c;最近有时间来系统的学一下蓝牙的知识。文章中很多都是通过学习韦东山老师的蓝牙讲解&#xff0c;讲得非常…

Excel技巧:如何对含有相同内容的列增加递增序号

如何在Excel中对含有相同内容的单元格自动添加递增序号 当我们在处理Excel数据时&#xff0c;经常会遇到需要根据某一列中的重复内容来对另一列的单元格进行编号的情况。例如&#xff0c;我们可能需要对所有含有特定字符的单元格进行标记&#xff0c;并在另一列中为它们分配一…

C语言项目实战——贪吃蛇

C语言实现贪吃蛇 前言一、 游戏背景二、游戏效果演示三、课程目标四、项目定位五、技术要点六、Win32 API介绍6.1 Win32 API6.2 控制台程序6.3 控制台屏幕上的坐标COORD6.4 GetStdHandle6.5 GetConsoleCursorInfo6.5.1 CONSOLE_CURSOR_INFO 6.6 SetConsoleCursorInfo6.7 SetCon…

2025汤家凤考研数学,基础视频课程+百度网盘+PDF真题讲解

平时大家都半开玩笑地讲&#xff1a;我数学想要考150分&#xff01;那索性今天这一期&#xff0c;今天认真和大家聊一下&#xff1a; 想考到考研数学150分&#xff0c;应该如何准备&#xff1f; 如果还有小伙伴不知道在哪看汤神的ke&#xff0c;可以看一下以下 2025汤神全程…

K线实战分析系列之二十:分手线——少见的持续信号

K线实战分析系列之二十&#xff1a;分手线——少见的持续信号 一、分手线二、分手线总结 一、分手线 从同一个地方出发&#xff0c;到相反的方向结束 二、分手线总结 分手线形态上一种持续信号&#xff0c;一般出现在趋势的中继阶段但是少数情况也会出现在行情的顶底的区域&a…

主备DNS服务器搭建并验证

目录 1. 配置静态网络 2. 配置主备DNS 2.1 DNS备服务器&#xff08;第二个虚拟机&#xff09; 2.2 两个虚拟机操作 2.3 备用服务器&#xff08;第二个虚拟机&#xff09;执行 2.4 两个虚拟机都添加DNS: 3. 验证 3.1 主DNS服务验证: 3.2 备用DNS服务器验证&am…

LSTM长短期记忆网

笔记来源—— 【重温经典】大白话讲解LSTM长短期记忆网络 如何缓解梯度消失&#xff0c;手把手公式推导反向传播 LSTM网络结构 RNN结构 下面拉出一个单元结构进行讲解 &#xff1a;记忆细胞&#xff0c;t-1时刻的记忆细胞 :表示状态,t-1时刻的状态 正是这样经过了一个单元&a…

稀碎从零算法笔记Day9-LeetCode:最后一个单词的长度

题型&#xff1a;字符串、反转字符串 链接:58. 最后一个单词的长度 - 力扣&#xff08;LeetCode&#xff09; 来源&#xff1a;LeetCode 题目描述&#xff08;红字为笔者添加&#xff09; 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔…

【Azure 架构师学习笔记】- Azure Service Endpoint

本文属于【Azure 架构师学习笔记】系列。 前言 在做Azure 架构时&#xff0c;经常会被问到Service Endpoint这个点&#xff0c;那么这篇文章来介绍一下Service Endpoint&#xff08;SE&#xff09;。 Azure Service Endpoint 首先它是一个专用通道&#xff0c;在Azure 资源之…

面试准备:排序算法大汇总 C++

排序算法总结 直接插入排序 取出未排序部分的第一个元素&#xff0c;与已排序的部分从后往前比较&#xff0c;找到合适的位置。将大于它的已排序的元素向后移动&#xff0c;将该元素插入到合适的位置。 //1. 直接插入排序 void InsertionSort(vector<int>& nums){f…

力扣日记3.6-【回溯算法篇】51. N 皇后

力扣日记&#xff1a;【回溯算法篇】51. N 皇后 日期&#xff1a;2023.3.6 参考&#xff1a;代码随想录、力扣 51. N 皇后 题目描述 难度&#xff1a;困难 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将…

汽车级瞬态抑制TVS二极管优势特性及型号大全

汽车级瞬态抑制TVS二极管是一种高性能的防浪涌过电压电路保护元器件&#xff0c;能够在瞬态电压过高的情况下提供可靠的保护。它能够迅速响应并吸收过电压&#xff0c;将其导向地线&#xff0c;从而保护车辆的电子设备免受损坏。东沃汽车级TVS二极管具有以下几个关键优势&#…

javaWebssh文玩竞价管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计

一、源码特点 java ssh文玩竞价管理系统是一套完善的web设计系统&#xff08;系统采用ssh框架进行设计开发&#xff09;&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0…

如何生成带有CRC的bin文件

本文介绍如何生成带有CRC的bin文件。 MCU在上电运行时&#xff0c;通常需要校验程序是否正确&#xff08;有无篡改或烧录文件出错&#xff09;&#xff0c;一般的做法是在烧录文件&#xff08;通常是bin文件&#xff09;末尾追加CRC&#xff08;CRC-8&#xff0c;CRC-16&#…