leetcode力扣——452. 用最少数量的箭引爆气球

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

目录

题目

思路:

代码


题目

要求:

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

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

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

示例:

以防有人看不懂的,找到了这张图(其实就是找有多少个气球的位置有重叠):

来自:一头小蜗牛的分享

思路:

这种讨论有没有位置重叠的,一般先给它排序。

排序完,咋解决呢?

举个栗子(本来应该用闭括号的,感觉看着不太清晰,这里用开括号了):

(0,6)(0,9)(2,9)(3,8)(3,9)(6,8)(7,12)(9,10)

哪几个气球位置有重叠呢?

两个:

(0,6) (7,12)

(0,9) (9,10)

(2,9)

(3,8)

(3,9)

(6,8)

左边这列:射击6就能将六个气球包圆,右边这列射击 9到10 都能把两个气球包圆

然后我们看左边这列,其实把(6,8)这个位置拿走,射击 3到6 都能把五个气球包圆,那么对于(3,6)加入(6,8)--> (6,6),其实就是收缩了区间 。可以理解为,取公共子集。


咋求公共子集:

  • 引入一个 left 和 right (int 类型)------用于保存公共子集的边界
cpp 复制代码
            if(points[i][0] >= left && points[i][0] <= right)
            {
                //收缩(求公共子集)
                left = max(left, points[i][0]);
                right = min(right, points[i][1]);
            }

代码

依照取得公共子集的逻辑,不难得到以下实现:

cpp 复制代码
class Solution
{
public:
    int findMinArrowShots(vector<vector<int>>& points)
    {
        int res = 1;
        //排序
        sort(points.begin(), points.end(), [](const vector<int> &a, const vector<int> &b)
        {return a[0] < b[0]; } );

        //统计
        int left = points[0][0], right = points[0][1];
        for(int i = 1; i < points.size(); i++)
        {
            //看受否将其包含在内
            if(points[i][0] >= left && points[i][0] <= right)
            {
                //收缩(求公共子集)
                left = max(left, points[i][0]);
                right = min(right, points[i][1]);
            }
            else
            {
                res++;
                //求下一个公共子集
                left = points[i][0];
                right = points[i][1];
            }
        }
        return res;
    }
};
相关推荐
强哥聊算力1 小时前
《算力江湖·英伟达传奇》第七集:ChatGPT出现前夜,英伟达发生了什么?
服务器·人工智能·算法·ai·chatgpt·gpu算力
2603_965148114 小时前
社区与学习资源:从入门到精通的API选品学习路径
数据库·人工智能·python·学习·数据挖掘
西柚小萌新4 小时前
【岗位面试】--成都博维数孪 - 工业 AI 解决方案顾问
人工智能·面试·职场和发展
小 黄 鸡4 小时前
Flutter 面试必会知识点详解(从基础到进阶)
flutter·面试·职场和发展
Navigator_Z5 小时前
LeetCode //C - 1289. Minimum Falling Path Sum II
c语言·算法·leetcode
CCblandy5 小时前
令牌桶在 0.9 倍负载超发 19%、固定窗口边界放行 20 个:四种限流算法同构实测
后端·python·算法·性能优化·架构
mmmmath_36 小时前
LeetCode.104.二叉树的最大深度
数据结构·leetcode
kaixin_啊啊6 小时前
【用于更准确 G×E 基因组预测的大规模作物数据集与基于深度学习的多模态融合框架】论文学习
人工智能·深度学习·学习
xier_ran6 小时前
【infra之路】AI 编译器学习笔记(六):重拾 C++——lambda 与 MLIR 中的回调
c++·笔记·学习
YangYang9YangYan7 小时前
2027供应链计划校招:数学与应用数学专业如何把预测模型讲成业务决策?
人工智能·sql·算法