452. 用最少数量的箭引爆气球
问题描述:传送门
思路:
1、sort函数 +贪心算法1(取左极限)
①先把这些气球从小到大sort排列。遇到两个相同的区间点【0,0】、【0,1】,默认第一个进去的,小于第二个。
注意,要写个cmp比较一下:
private:
static bool cmp(const vector<int>&a,const vector<int>&b){
return a[0]<b[0];
}
public:
sort(points.begin(),points.end(),cmp);
②如果区间是空的,返回0;
if(points.empty()){
return 0;
}
反之,取第一个点的区间为默认区间。arrows的数量默认为1。
vector<int> range={points[0][0],points[0][1]};//设置默认区间
int arrows =1;
从第二个点开始算,当前区间的左极限如果小于等于默认区间的右极限,取交集。
反之,把当前点设为默认区间,arrows+1。
for(int i=1;i<points.size();i++){
auto cur=points[i];
//下一个点的左边界小于本节点的右边界
if(cur[0]<=range[1]){
range[0]=max(cur[0],range[0]);
range[1]=min(cur[1],range[1]);
}else{
range[0]=cur[0];
range[1]=cur[1];
arrows++;
}
}
return arrows;
举个例子 [[10,16],[2,8],[1,6],[7,12]] 。
①sort后:[[1,6],[2,8],[7,12],[10,16]]
②区间不为空,取第一个点【1,6】默认区间。
第二个点,要取交集。
第三个点,默认区间。
第四个点,要取交集。
算下来,arrows=2;
如下图,
代码:
class Solution {
private:
static bool cmp(const vector<int>&a,const vector<int>&b){
return a[0]<b[0];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
if(points.empty()){
return 0;
}
sort(points.begin(),points.end(),cmp);
vector<int> range={points[0][0],points[0][1]};
int arrows =1;
for(int i=1;i<points.size();i++){
auto cur=points[i];
//下一个点的左边界小于本节点的右边界
if(cur[0]<=range[1]){
range[0]=max(cur[0],range[0]);
range[1]=min(cur[1],range[1]);
}else{
arrows++;
range[0]=cur[0];
range[1]=cur[1];
}
}
return arrows;
}
};
2、sort函数 +贪心算法1(取右极限)
直接算默认区间的右极限
int pos=points[0][1];
当前区间的左极限比它大的话,才arrows++;
for(int i=1;i<points.size();i++){
if(points[i][0]>pos){
pos =points[i][1];
arrows++;
}
}
return arrows;
写sort函数时,如下测试样例,遇到【0,9】排在【0,6】面前,很可能一箭射出去了。
所以要写成【0,6】,【0,9】的排序,保证两箭。
sample:
[[3,9],[7,12],[3,8],[6,8],[9,10],[2,9], [0,9] ,[3,9], [0,6] ,[2,8]]
private:
static bool cmp(const vector<int>&a,const vector<int>&b){
return a[1]<b[1];
}
代码:
class Solution {
private:
static bool cmp(const vector<int>&a,const vector<int>&b){
return a[1]<b[1];
}
public:
int findMinArrowShots(vector<vector<int>>& points) {
if(points.empty()){
return 0;
}
sort(points.begin(),points.end(),cmp);
int pos=points[0][1];
int arrows =1;
for(int i=1;i<points.size();i++){
if(points[i][0]>pos){
pos =points[i][1];
arrows++;
}
}
return arrows;
}
};