投飞镖刺破气球
452. Minimum Number of Arrows to Burst Balloons (Medium)
相比较上一个题调整了start的位置 因为start只有在前一堆重叠的气球里面不在有效了 人就换成下一个气球所在的区间
Input:
[[10,16], [2,8], [1,6], [7,12]]
Output:
2
题目描述:气球在一个水平数轴上摆放,可以重叠,飞镖垂直投向坐标轴,使得路径上的气球都会刺破。求解最小的投飞镖次数使所有气球都被刺破。
也是计算不重叠的区间个数,不过和 Non-overlapping Intervals 的区别在于,[1, 2] 和 [2, 3] 在本题中算是重叠区间。
思路:跟上一道题一样 拿到手就想着把区间先排个序,按照以往的规则考虑按右边界来排序,这很好理解。接下来
设置一个cnt来计算飞镖个数,只要区间存在那起码是1个飞镖起步
再看for循环 从第二个区间开始考虑,只要第i个区间的左边界比第i-1个左区间的右边界小或者相等,就说明一个飞镖足以射穿这俩,但是如果i+1 的左边界也是比i-1的右边界小呢?这不能试试用循环i的方式来解决 是需要引入一个start
start从0开始 直到满足了右边界比第i区间的左边界小了,说明气球不再重叠。那么此时下一个start应该就是这个i区间
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length == 0)
return 0;
Arrays.sort(points,new Comparator<int[]>(){
public int compare(int[] i1,int[] i2){
return i1[1] -i2[1];
}
});
int cnt = 1;
int start = 0;
for(int i=1; i<points.length; i++){
if(points[i][0] - points[start][1] <= 0){
continue;
}
start = i;
cnt++;
}
return cnt;
}
}