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

简介: leetcode 452用最少数量的箭引爆气球

用最少数量的箭引爆气球


image.png

计算交叠区间法(时间复杂度高,但是没超时)

class Solution {
public:
    static bool compare(vector<int> &a , vector<int> &b)
    {
        return a[0] < b[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),compare); //按照气球的起始位置排序
        int result = 0 ;
        vector<vector<int>> cover;
        for(int i=0 ; i<points.size(); i++)
        {
           if(cover.size()==0) //第一个气球的区间,直接设置为第一个重叠取
           {
               cover.push_back(points[i]);
               continue;
           } 
           for(int j=0 ;j<cover.size();j++) //遍历重叠区,看新气球有没有和已有区域重叠的
           {
               if(cover[j][1] >= points[i][0]) //发现新气球和已有区域重叠
               {
                  //部分重叠
                    if(points[i][0] >= cover[j][0] && points[i][1] > cover[j][1]) 
                        cover[j][0] = points[i][0]; //更新重叠区(越更新越小)
                    //新气球是已有重叠区域的子集,更新重叠区
                    else if(points[i][0] >= cover[j][0] && points[i][1] <= cover[j][1]) 
                        cover[j] = points[i];   
                    break;                 
               }
               //不属于任何一个重叠区,自己为一个新区
               if(j == cover.size()-1 )
               {
                   cover.push_back(points[i]);
                   break;
               }
           }
        }
        return cover.size(); //一个重叠区一个箭
    }
};

贪心法

7d8bf66d6f3741b69250db58daa2ec63.png

class Solution {
public:
    static bool compare(vector<int> &a , vector<int> &b)
    {
        return a[0] < b[0];
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        sort(points.begin(),points.end(),compare);
        int result = 1 ;
        for(int i=1 ; i<points.size(); i++)
        {
            if (points[i][0] > points[i - 1][1]) // 气球i和气球i-1不挨着,注意这里不是>=
            {  
                result++; // 需要一支箭
            }
            else // 气球i和气球i-1挨着
            {  
                points[i][1] = min(points[i - 1][1], points[i][1]); // 更新重叠气球最小右边界
            }
        }
        return result;
    }
};

二刷

class Solution {
public:
    static bool cmp(vector<int> &a , vector<int> &b)
    {
        return a[0] <= b[0]; 
    }
    int findMinArrowShots(vector<vector<int>>& points) {
        if(points.size()==0) return 0;
        int result = 1;
        sort(points.begin(),points.end(),cmp);
        for(int i=0 ; i<points.size() ;i++)
            cout<<points[i][0]<<' '<<points[i][1]<<endl;
        for(int i=1 ; i<points.size() ;i++)
        {
           if(points[i][0] > points[i-1][1]) result++;
           else points[i][1] = min(points[i][1],points[i-1][1]);
        }
        return result;
    }
};
相关文章
|
6月前
|
Java
leetcode-452:用最少数量的箭引爆气球
leetcode-452:用最少数量的箭引爆气球
60 0
|
3月前
|
算法 vr&ar 虚拟化
【Leetcode刷题Python】452. 用最少数量的箭引爆气球
首先对气球的结束坐标进行排序,然后使用贪心算法,按顺序选择每个气球的结束坐标作为射箭的点,只要气球的开始坐标大于前一个气球的结束坐标,就意味着需要多一支箭,更新最小箭数。这种方法可以确保以最少的箭数引爆所有气球。
18 1
|
6月前
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
代码随想录Day29 贪心04 LeetCode T860 柠檬水找零 T406 根据身高重建队列 T452 用最少得箭引爆气球
40 0
|
6月前
leetcode-1189:“气球” 的最大数量
leetcode-1189:“气球” 的最大数量
30 0
|
12月前
|
算法 Java
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
代码随想录算法训练营第三十四天 | LeetCode 860. 柠檬水找零、406. 根据身高重建队列、452. 用最少数量的箭引爆气球
63 0
|
存储 算法 C语言
【动态规划】LeetCode 312. 戳气球 --区间DP问题
因为一些事,最近状态不是很好,加上今天的每日一题有点难,看的烦躁(就是菜 ,就来更新一下今天与每日一题相关的区间Dp问题(戳气球),这篇也是关于区间Dp的问题 uu可以看看
104 0
|
算法 C++ Python
每日算法系列【LeetCode 312】戳气球
每日算法系列【LeetCode 312】戳气球
|
2月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
52 6
|
3月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
102 2