本题目本质是找到重叠的区间
本题步骤如下:
1.按区间左边界进行排序。
2.起始的弓箭数为1,因为第一个气球需要1个弓箭
3.循环,如果后一个弓箭的左边界大于前一个弓箭的右边界证明二者不重叠,相反是小于等于,重叠。
4.重叠了当此时的(后一个)弓箭的右边界更新为前一个和后一个的右边界的最小值。不重叠则需要多一个弓箭来射。
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
return a[0] < b[0];
}
int findMinArrowShots(vector<vector<int>>& points) {
if(points.size() == 0) return 0;
sort(points.begin(),points.end(),cmp);
int res = 1;
for(int i=1;i<points.size();i++){
if(points[i][0] <= points[i-1][1]){
points[i][1] = min(points[i-1][1],points[i][1]);
}else{
res++;
}
}
return res;
}
};