【452. 用最少数量的箭引爆气球 中等】

server/2025/1/31 5:42:56/

题目:

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

一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x 处射出一支箭,若有一个气球的直径的开始和结束坐标为 xstart,xend, 且满足 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 <= 105
  • points[i].length == 2
  • -231 <= xstart < xend <= 231 - 1

思路:

为了让气球尽可能的重叠,需要对数组进行排序。

那么按照气球起始位置排序,还是按照气球终止位置排序呢?

其实都可以!只不过对应的遍历顺序不同,我就按照气球的起始位置排序了。

既然按照起始位置排序,那么就从前向后遍历气球数组,靠左尽可能让气球重复。

从前向后遍历遇到重叠的气球了怎么办?

如果气球重叠了,重叠气球中右边边界的最小值 之前的区间一定需要一个弓箭。

以题目示例: [[10,16],[2,8],[1,6],[7,12]]为例,如图:(方便起见,已经排序)
452.用最少数量的箭引爆气球

可以看出首先第一组重叠气球,一定是需要一个箭,气球3,的左边界大于了 第一组重叠气球的最小右边界,所以再需要一支箭来射气球3了。


代码:

class Solution {
public://  从小到大对points排序static bool cmp(const vector<int>& a, const vector<int>& b){return a[0] < b[0];}int findMinArrowShots(vector<vector<int>>& points) {if(points.empty()) return 0;int result = 1; //  points不为空时至少需要一支箭sort(points.begin(), points.end(), cmp);for(int i = 1; i < points.size(); i++){if(points[i][0] > points[i - 1][1]){    //  气球i和i - 1不挨着时,result++result++;}else{   //  气球i和i - 1挨着points[i][1] = min(points[i - 1][1], points[i][1]); //  更新重叠气球最小有边界}}return result;}
};

总结:

时间复杂度:O(nlog n),因为有一个快排
空间复杂度:O(n),有一个快排,最差情况(倒序)时,需要n次递归调用。因此确实需要O(n)的栈空间


参考:

代码随想录


http://www.ppmy.cn/server/163384.html

相关文章

Kafka常见问题之 `javax.management.InstanceAlreadyExistsException`

文章目录 Kafka常见问题之 javax.management.InstanceAlreadyExistsException1. 概述2. 常见原因3. 具体异常示例4. 解决方案4.1 确保单一 Kafka Producer 实例4.2 配置 Kafka Broker 和 Producer 使用唯一的 JMX 名称&#xff08;对于Producer重点检查 client.id&#xff09;4…

【汽车电子架构】AutoSAR从放弃到入门专栏导读

本文是汽车电子架构&#xff1a;AutoSAR从放弃到入门专栏的导读篇。文章延续专栏文章的一贯作风&#xff0c;从概念与定义入手&#xff0c;希望读者能对AutoSAR架构有一个整体的认识&#xff0c;然后对专栏涉及的文章进行分类与链接。本文首先从AutoSAR汽车软件架构的概念&…

庆祝2025到来:C++编程的新篇章

作者&#xff1a;w(&#xff9f;Д&#xff9f;)w吓洗宝宝了 发布时间&#xff1a;2025年1月19日00:00 引言 新年伊始&#xff0c;万象更新。在这充满希望的2025年&#xff0c;我们迎来了新的机遇和挑战。作为C编程爱好者的一员&#xff0c;我感到无比激动和自豪。C作为一种强…

JAVA设计模式:依赖倒转原则(DIP)在Spring框架中的实践体现

文章目录 一、DIP原则深度解析1.1 核心定义1.2 现实比喻 二、Spring中的DIP实现机制2.1 传统实现 vs Spring实现对比 三、Spring中DIP的完整示例3.1 领域模型定义3.2 具体实现3.3 高层业务类3.4 配置类 四、Spring实现DIP的关键技术4.1 依赖注入方式对比4.2 自动装配注解 五、D…

Science Advances 用于独立检测压力和温度的3D主动矩阵多模态传感器阵列

研究背景同时独立地进行压力和温度传感对于创建复制人体皮肤复杂感觉功能的电子皮肤至关重要。带有传感器的薄膜晶体管 &#xff08;TFT&#xff09; 阵列实现了无串扰的空间传感。然而&#xff0c;半导体中电荷传输的热依赖性导致了热刺激和压力刺激之间的干扰。 创新点浦项科…

Node.js日志记录新篇章:morgan中间件的使用与优势

在Node.js的广阔生态系统中&#xff0c;日志记录是开发过程中不可或缺的一部分。它不仅有助于开发者追踪应用程序的运行状态&#xff0c;还能在出现问题时提供宝贵的调试信息。而在众多日志记录工具中&#xff0c;Morgan以其高效、易用和专注于HTTP请求日志的特点&#xff0c;成…

Python帝王學集成-母稿

引用:【【全748集】这绝对是2024最全最细的Python全套教学视频,七天看完编程技术猛涨!别再走弯路了,从零基础小白到Python全栈这一套就够了!-哔哩哔哩】 https://b23.tv/lHPI3XV 语法基础 Python解释器与pycharm编辑器安装 - 定义:Python解释器负责将Python代码转换为计…

硬件电路(5)-压敏电阻

一、概述 压敏电阻&#xff0c;顾名思义&#xff0c;对电压很敏感的电阻&#xff1b;中文这个“敏感”对应到电路中&#xff0c;应该就是一个非线性的变化&#xff1a;当电压达到一定的数值的时候&#xff0c;器件的阻抗呈现出剧烈的变化&#xff0c;这个剧烈的变化应该是量级上…