LeetCode 452. 用最少数量的箭引爆气球(贪心算法)

简介: LeetCode 452. 用最少数量的箭引爆气球(贪心算法)

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


贪心算法

思路

首先对数组按照右边界升序排序。我们从第一个气球的右边界开始射箭,寻找气球左边界小于第一个气球右边界的气球(因为这些气球一定会被同时引爆),而当遍历到某个气球的最左侧值大于当前射出的箭最右侧值的时候,我们之前射出的箭并不能解决掉这个气球,这时候就需要一支新的箭在这个不能解决掉的气球的最右侧发射。在这样的贪心策略下(由局部最优(如果当前射出最右侧的箭都不能解决某个气球,才需要一支新的箭)找到全局最优),最终会得到最少的箭数。


代码分析

class Solution
{
public:
    static bool cmp(vector<int> &a, vector<int> &b)
    {
        return a[1] < b[1];
    }
    int findMinArrowShots(vector<vector<int>> &points)
    {
        sort(points.begin(), points.end(), cmp);
        int pre = points[0][1], count = 1;
        for (int i = 1; i < points.size(); i++)
        {
            // 无重叠则开启下一轮
            if (points[i][0] > pre)
            {
                pre = points[i][1];
                count++;
            }
        }
        return count;
    }
};


主要是参考了之前无重叠区间的思想,改写了一下,还是比较顺利的。


复杂度分析

时间复杂度:O ( n l o g n ),其中 n nn 是数组 p o i n t s 的长度。排序的时间复杂度为 O ( n l o g n ) ,对所有气球进行遍历并计算答案的时间复杂度为 O ( n ),其在渐进意义下小于前者,因此可以忽略。


空间复杂度:O ( l o g n ) ,即为排序需要使用的栈空间。

目录
相关文章
|
2月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
47 0
|
1月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
4月前
|
算法
测试工程师的技能升级:LeetCode算法挑战与职业成长
这篇文章通过作者亲身体验LeetCode算法题的过程,探讨了测试工程师学习算法的重要性,并强调了算法技能对于测试职业成长的必要性。
82 1
测试工程师的技能升级:LeetCode算法挑战与职业成长
|
4月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
58 6
|
4月前
|
存储 算法 Java
LeetCode经典算法题:打家劫舍java详解
LeetCode经典算法题:打家劫舍java详解
79 2
|
4月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
55 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
70 1
|
4月前
|
算法 vr&ar 虚拟化
【Leetcode刷题Python】452. 用最少数量的箭引爆气球
首先对气球的结束坐标进行排序,然后使用贪心算法,按顺序选择每个气球的结束坐标作为射箭的点,只要气球的开始坐标大于前一个气球的结束坐标,就意味着需要多一支箭,更新最小箭数。这种方法可以确保以最少的箭数引爆所有气球。
25 1
|
4月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
84 0
|
4月前
|
算法 Java
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
LeetCode初级算法题:子数组最大平均数+二叉树的最小深度+最长连续递增序列+柠檬水找零
45 0