重叠区域问题
此类问题的解法,首先先对区域进行排序,将区域排序后方便后续循环比较。
然后根据题目选择合适的筛选条件以及设立外部指针保存当前筛选值(比如选取每次比较的最小值,就需要设立一个指针去存储比较后的最小值)
最后通过for循环遍历比较。
452. 用最少数量的箭引爆气球
题目
有一些球形气球贴在一堵用 XY 平面表示的墙面上。墙面上的气球记录在整数数组 points
,其中points[i] = [xstart, xend]
表示水平直径在 xstart
和 xend
之间的气球。你不知道气球的确切 y 坐标。
一支弓箭可以沿着 x 轴从不同点 完全垂直 地射出。在坐标 x
处射出一支箭,若有一个气球的直径的开始和结束坐标为 x
start
,x
end
, 且满足 xstart ≤ x ≤ x
end
,则该气球会被 引爆 。可以射出的弓箭的数量 没有限制 。 弓箭一旦被射出之后,可以无限地前进。
给你一个数组 points
,返回引爆所有气球所必须射出的 最小 弓箭数 。
示例 1:
输入:points = [[10,16],[2,8],[1,6],[7,12]] 输出:2 解释:气球可以用2支箭来爆破: -在x = 6处射出箭,击破气球[2,8]和[1,6]。 -在x = 11处发射箭,击破气球[10,16]和[7,12]。
提示:
1 <= points.length <= 105
points[i].length == 2
-231 <= xstart < xend <= 231 - 1
解题
先对数组进行排序。待排序后,从第一个区间的右端点right 开始比较。若当前区间的左端点小,则比较右端点与right指针的值,选取最小值赋值给right。若大于则count++,right等于当前右端点。
时间复杂度:O(NlogN)。因为对输入数据进行了排序。
空间复杂度:O(1),仅仅使用了常数空间。
代码
c++
class Solution {
public:
int findMinArrowShots(vector<vector<int>>& points) {
int right=0;
// 计数器 射出的箭头的数目
int count=1;
int numb=points.size();
// 对数组进行排序方便后续循环比较
sort(points.begin(),points.end());
right=points[0][1];
for(int i=1;i<numb;i++){
if(points[i][0]<=right){
// 选取最小值
right=min(right,points[i][1]);
}else{
// 箭头数加一,right指针指向当前右端点。
count++;
right=points[i][1];
}
}
return count;
}
};