实现思路
实际上每一个气球至少需要一个弓箭手,那么这个弓箭手在射击的时候需要贪心的尽可能的多射击气球。说明这道题可以使用贪心的策略来求解,做了这几道题综合观察确实贪心一般都是线性的,也就意味着在求解的时候可以从头遍历到尾基本在这个过程中就可以得到问题的解了。
具体在代码的实现的过程中,先把所有数据按照start的值升序排序,end的值先不用管,在后序会处理。这个过程中,取区间的交集,不能取到交集的情况下说明需要新分配一个弓箭手。
实现代码
bool cmp(const vector<int> &a,const vector<int> &b){
return a[0]<b[0];
}
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
int n=points.size();
if(n<2) return n;
int shot_num=1;
sort(points.begin(),points.end(),cmp);
int shot_start=points[0][0],shot_end=points[0][1];
for(int i=1;i<n;i++){
if(points[i][0]<=shot_end){
shot_start=points[i][0];
if(points[i][1]<shot_end){
shot_end=points[i][1];
}
}
else{
shot_num++;
shot_start=points[i][0];
shot_end=points[i][1];
}
}
return shot_num;
}
};
代码这里需要多说明的一点,要注意两个区间start相等的情况也是要处理,这样才能下一步来比较end的值
提交结果及分析
时间复杂度O(n)
注意问题
这里面利用了C++的中的sort,但是想要特殊类型的需要自己实现返回值为bool类型的cmp函数,注意这个函数需要时static类型的,最简单就是将其定义在类的外部即可