思路
贪心,对于每个气球至少安排一个弓箭手就可以射穿;在射穿该气球的同时我们尽可能地往后移动击穿尽可能多
的其他气球。
- 按照气球的左端点从小到大排序
- 维护左右区间
- 图解如下
代码
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length==0) return 0;
Arrays.sort(points,(o1,o2)->(o1[0]<o2[0]?-1:1));
int shoot_start = points[0][0];
int shoot_end = points[0][1];
int ans = 1;
for(int i=1;i<points.length;i++){
//维护左区间
if(points[i][0]<=shoot_end) shoot_start = points[i][0];
//维护右区间
if(points[i][1]<shoot_end) shoot_end = points[i][1];
//第三种情况,两个区间并无交集
if(points[i][0]>shoot_end){
ans++;
shoot_start = points[i][0];
shoot_end = points[i][1];
}
}
return ans;
}
}