ok
看题:
ok,其实题目还是挺好理解的,就是在一个水平区域内,会有很多的气球,这个气球会有横向的坐标。表明该气球在哪个坐标开始到哪个坐标结束,但是因为给出的坐标可以重叠的缘故,气球之间也会重叠起来,而你要在x轴上射箭,如果方法得当,你可以用一根箭射穿重叠的气球,我们需要最少的射箭数。
看代码:
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
if(points.empty()){
return 0;
}//这里判断这个区域到底有没有气球,没有气球就不需要射箭
sort(points.begin(),points.end(),[](const vector<int>&u,const vector<int>&v){
return u[1]<v[1];
});//重写排序算法,按照每个气球的结束坐标从小到大排序,目的是为了之后在逻辑中找到重叠的部分
int x=points[0][1];//初始化,找到第一个结束的气球的结束坐标
int ans=1;//计数器,因为排除了空的情况,所以至少射一发
for(const vector<int> t:points){//遍历气球数组
if(t[0]>x){//如果一个气球的开始坐标大于了初始化结束坐标,说明这个两个气球没有缘分
//没有重叠在一起的部分,所以,就加一个射箭数,并且把当前气球的结束坐标作为比较值
//继续找下一个没有缘分的气球。
ans++;
x=t[1];
}
}
return ans;
}
};
ok,就是这样,最开始想用bfs来做,应该可以做出来,但是感觉会很麻烦