https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/
java
class Solution {
public int findMinArrowShots(int[][] points) {
//按区间起点排序
Arrays.sort(points,new Comparator<int[]>(){
public int compare(int[] a,int[] b){
return a[0]-b[0];
}
});
int len=points.length;
if(len==1) return 1;
int[] before=points[0];//第一个区间
int count=1;
for(int i=1;i<len;i++){
//如果区间重叠
if(points[i][0]>=before[0]&&points[i][0]<=before[1]){
int[] cur=new int[2];
cur[0]=Math.max(points[i][0],before[0]);
cur[1]=Math.min(points[i][1],before[1]);
before=cur;
}
else{//区间不重叠
count++;//需要加一支箭
before=points[i];
}
}
return count;
}
}
/**
ab两个区间有重叠的部分,ab两个区间合并后就只剩下重叠的部分。
*/
更简洁的别人的写法
java
/**
* 时间复杂度 : O(NlogN) 排序需要 O(NlogN) 的复杂度
* 空间复杂度 : O(logN) java所使用的内置函数用的是快速排序需要 logN 的空间
*/
class Solution {
public int findMinArrowShots(int[][] points) {
// 根据气球直径的开始坐标从小到大排序
// 使用Integer内置比较方法,不会溢出
Arrays.sort(points, (a, b) -> Integer.compare(a[0], b[0]));
int count = 1; // points 不为空至少需要一支箭
for (int i = 1; i < points.length; i++) {
if (points[i][0] > points[i - 1][1]) { // 气球i和气球i-1不挨着,注意这里不是>=
count++; // 需要一支箭
} else { // 气球i和气球i-1挨着
points[i][1] = Math.min(points[i][1], points[i - 1][1]); // 更新重叠气球最小右边界
}
}
return count;
}
}
