Encuentre el intervalo superpuesto más largo
// class Solution {
// public:
// int findMinArrowShots(vector<vector<int>>& points) {
// if(points.empty())
// return 0;
// sort(points.begin(),points.end(),[&](const vector<int>& a,const vector<int>& b)
// {return a[0] <= b[0];});
// int pre = points[0][1];
// int ballooms = 0;
// for(int i = 1;i < points.size();i++){
// if(pre >= points[i][0]){
// pre = max(points[i][1],pre);
// }else {
// ballooms++;
// pre = points[i][1];
// }
// }
// return ballooms;
// }
// };
//我错了,爆掉的气球并不能引爆另外的气球。
//这道题本质上是寻找有几个并区间
class Solution {
public:
static bool cmp(const vector<int>& a,const vector<int>& b){
if(a[0] < b[0])
return true;
else if(a[0] == b[0])
return a[1] < b[1];
else return true;
}
int findMinArrowShots(vector<vector<int>>& points) {
if(points.empty())
return 0;
sort(points.begin(),points.end(),cmp);
int pre = points[0][1];
int ballooms = 0;
for(int i = 1;i < points.size();i++){
if(pre >= points[i][0] && pre <= points[i][1]){
}else {
ballooms++;
pre = points[i][1];
}
}
return ballooms;
}
};
En la segunda edición, trata de elegir entre áreas pequeñas. El más pequeño es más probable que se superponga con otras personas.
class Solution {
public:
// static bool cmp(const vector<int>& a,const vector<int>& b){
// if(a[0] < b[0])
// return true;
// else if(a[0] == b[0])
// return a[1] < b[1];
// else return true;
// }
int findMinArrowShots(vector<vector<int>>& points) {
if(points.empty())
return 0;
sort(points.begin(),points.end(),[](const vector<int>& a,const vector<int>& b){
return a[1] < b[1];
});
int pre = points[0][1];
int ballooms = 1;
for(int i = 1;i < points.size();i++){
if(pre >= points[i][0] && pre <= points[i][1]){
}else {
ballooms++;
pre = points[i][1];
}
}
return ballooms;
}
};