画图可以帮助理解题意。
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;
}
};