【数组】Leetcode 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]

解题思路

要解决这个问题,需要明白怎么能覆盖更多的气球,就是要尽可能多地让弓箭覆盖气球的直径区间,每次弓箭一定在某个气球的最右端。

  • 排序: 首先按照每个气球的右端点进行排序。排序后的气球列表有助于找到最早结束的气球,从而减少弓箭的数量。
  • 遍历和选择: 从排序后的第一个气球开始,选择第一个气球的右端点作为第一支弓箭的位置。 这支弓箭能够覆盖所有与之重叠的气球。 然后继续查找未被覆盖的气球,从第一个未被覆盖的气球开始,重复上述过程。

Java实现

java 复制代码
public class MinimumArrowsToBurstBalloons {
    public int findMinArrowShots(int[][] points) {
        if (points.length == 0) {
            return 0;
        }
        
        // 按右端点排序
        Arrays.sort(points, Comparator.comparingInt(a -> a[1]));
        
        int arrows = 1; // 至少需要一支弓箭
        int arrowPos = points[0][1]; // 第一支弓箭的位置为第一个气球的右端点
        
        for (int i = 1; i < points.length; i++) {
            // 如果当前气球的起点大于弓箭位置,说明需要新的弓箭
            if (points[i][0] > arrowPos) {
                arrows++;
                //更新下一次弓箭的位置为当前元素右边界
                arrowPos = points[i][1];
            }
        }
        
        return arrows;
    }

    public static void main(String[] args) {
        MinimumArrowsToBurstBalloons solution = new MinimumArrowsToBurstBalloons();

        int[][] points1 = {{10, 16}, {2, 8}, {1, 6}, {7, 12}};
        System.out.println(solution.findMinArrowShots(points1)); // 输出: 2

        int[][] points2 = {{1, 2}, {3, 4}, {5, 6}, {7, 8}};
        System.out.println(solution.findMinArrowShots(points2)); // 输出: 4

        int[][] points3 = {{1, 2}, {2, 3}, {3, 4}, {4, 5}};
        System.out.println(solution.findMinArrowShots(points3)); // 输出: 2
    }
}

时间空间复杂度

  • 时间复杂度: O(n log n),其中 n 是气球的数量。主要耗时在排序步骤。
  • 空间复杂度: O(1),除了存储排序后的数组,不需要额外的空间。
相关推荐
hsling松子24 分钟前
使用PaddleHub智能生成,献上浓情国庆福
人工智能·算法·机器学习·语言模型·paddlepaddle
dengqingrui1231 小时前
【树形DP】AT_dp_p Independent Set 题解
c++·学习·算法·深度优先·图论·dp
C++忠实粉丝1 小时前
前缀和(8)_矩阵区域和
数据结构·c++·线性代数·算法·矩阵
ZZZ_O^O1 小时前
二分查找算法——寻找旋转排序数组中的最小值&点名
数据结构·c++·学习·算法·二叉树
CV-King2 小时前
opencv实战项目(三十):使用傅里叶变换进行图像边缘检测
人工智能·opencv·算法·计算机视觉
代码雕刻家2 小时前
数据结构-3.9.栈在递归中的应用
c语言·数据结构·算法
雨中rain2 小时前
算法 | 位运算(哈希思想)
算法
Kalika0-04 小时前
猴子吃桃-C语言
c语言·开发语言·数据结构·算法
sp_fyf_20244 小时前
计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-10-02
人工智能·神经网络·算法·计算机视觉·语言模型·自然语言处理·数据挖掘
我是哈哈hh6 小时前
专题十_穷举vs暴搜vs深搜vs回溯vs剪枝_二叉树的深度优先搜索_算法专题详细总结
服务器·数据结构·c++·算法·机器学习·深度优先·剪枝