https://leetcode.cn/problems/minimum-number-of-arrows-to-burst-balloons/description/
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两个区间合并后就只剩下重叠的部分。*/
更简洁的别人的写法
/*** 时间复杂度 : 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;}
}