用最少数量的箭引爆气球


画图可以帮助理解题意。

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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值