用最少数量的箭引爆气球


画图可以帮助理解题意。

1.对于某个气球,至少需要1个弓箭

2.击穿这只气球的同时,尽可能多的击穿其他的

将气球按照左端点从小到大的顺序排序,然后每次遍历气球时,看这个气球在没在当前可射击区间内,在的话,就看用不用更新射击区间。如果不在当前可射击区间内的话,就开辟一个新的区间,射击数也就需要加1.

    bool cmp(const pair<int,int>& a,const pair<int,int>& b)
    {
         return a.first < b.first;
    }

class Solution {
public:
           
    int findMinArrowShots(vector<pair<int, int>>& points) {
        if(points.size() == 0)
            return 0;
        
        //将气球按照左端点的位置从小到大排序
        sort(points.begin(),points.end(),cmp);
        
        int shoot_num = 1;//至少射击1次
        int shoot_begin = points[0].first;//当前射击区间的左端点
        int shoot_end   = points[0].second;//右端点
        //扫描后面的每个气球
        for(int i = 1;i<points.size();++i)
        {
            if(points[i].first <= shoot_end)//如果这个气球在当前射击区间内
            {
                shoot_begin = points[i].first;
                if(points[i].second <= shoot_end)
                    shoot_end = points[i].second;
            }else{//开一个新的区间
                shoot_num++;
                shoot_begin = points[i].first;
                shoot_end = points[i].second;
            }
        }
        return shoot_num;
    }
};

猜你喜欢

转载自blog.csdn.net/qq_22080999/article/details/80569037