题目:
分析:发现这个问题和另一个使用贪心的经典问题很像,活动场地安排的问题(如何在一个场地安排最多的活动),同样给出了“开始”和“结束”,活动场地安排问题给出的是每个活动的开始和结束时间,这个问题是给出了每个气球的开始和结束位置,想到这里思路就出来了,如果按结束排好了序,那么取开始比结束小的,就归为一支箭可以解决,否则要加一支箭(活动场地安排问题则是按结束排好序,从第一个活动开始,然后后续都选第一个开始比目前结束大的)
代码:
class Solution {
public int findMinArrowShots(int[][] points) {
if(points.length == 0 || points == null){
return 0;
}
Arrays.sort(points, new pointsComparator());
//已排序
int end = points[0][1];
int arrow = 1;
for(int i = 0; i < points.length; i++){
if(points[i][0] > end){
arrow++;
end = points[i][1];
}
}
return arrow;
}
}
class pointsComparator implements Comparator<int[]>{
@Override
public int compare(int[] point1, int[] point2){
if(point1[1] < point2[1]){
return -1;
}else if(point1[1] > point2[1]){
return 1;
}else{
return 0;
}
}
}
因为要自定义按结束排序,所以需要自定义一个Comparator