当前位置: 首页 > article >正文

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

题目:

有一些球形气球贴在一堵用 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.kler.cn/a/523700.html

相关文章:

  • 图论——最小生成树的扩展应用
  • 供应链系统设计-供应链中台系统设计(十)- 清结算中心概念片篇
  • 【单细胞第二节:单细胞示例数据分析-GSE218208】
  • 用 Scoop 优雅管理 Windows 软件:安装、配置与使用全指南
  • 2007-2020年各省国内专利申请授权量数据
  • go gin配置air
  • 使用iis服务器模拟本地资源服务器unityaddressables热更新出错记录
  • C++11中array容器的常见用法
  • fpga系列 HDL:XILINX Vivado Vitis 高层次综合(HLS) 实现 EBAZ板LED控制(上)
  • Unity游戏(Assault空对地打击)开发(3) 摄像机跟随
  • 卡通圣诞节404动画页面模板
  • Spring Security(maven项目) 3.0.2.8版本
  • 17.Word:李楠-学术期刊❗【29】
  • C语言中string.h头文件功能介绍
  • Vscode的AI插件 —— Cline
  • Vue Vine:Vue 组件开发的新范式探索
  • spark3.5.4兼容python 3.10.x以下版本
  • 环境搭建--vscode
  • Object类(2)
  • 使用 KNN 搜索和 CLIP 嵌入构建多模态图像检索系统
  • [论文总结] 深度学习在农业领域应用论文笔记14
  • 人工智能:农业领域的变革力量
  • 如何制作浪漫风格的壁纸
  • 【PowerShell专栏】利用PowerShell开启端口的监听
  • GEE | 提取随机样本点的数据,以CHIRPS降水为例
  • Kotlin函数式API