题目
思路:
活动选择问题,会议室选择问题开展最多会议数目,其实一一个类型
将开始时间(坐标)和结束时间排序(任选一个就行,我看c++做法里面有按照开始时间排序,本体中是结束时间排序,感觉按照结束时间排序更合理)
将所有的气球按照终止位置排序,开始从前向后扫描。以第一个气球的终止位置为准,只要出现的气球起始位置小于这个气球的终止位置,代表可以一箭使这些气球全部爆炸;当出现一个气球的起始位置大于第一个气球的终止位置时再以这个气球的终止位置为准,找出所有可以再一箭爆炸的所有气球;以此类推
上面这个图是看的刷题班里面给的思路,感觉不是很好,看看图吧理解一下
class Solution {
public int findMinArrowShots(int[][] points) {
if(points ==null||points.length==0||points[0].length==0){
return 0;
}
Arrays.sort(points,new Comparator<int[]>() {//右端点排序
public int compare(int[] a, int[] b){
return a[1]-b[1];
}
});
//从左往右射击
int lastEnd = points[0][1];//题上没说只在第一区间,所以有可能在第二象限
int minShots=1;
for(int i=1;i<points.length;i++){
if(lastEnd<points[i][0]){
lastEnd=points[i][1];
minShots++;
}
}
return minShots;
}
}
注意:
新写的compara函数里面返回序列是
return a[1]-b[1];
这就是说明是按照points二维数组中的行中的第二列(下标是1)进行排序的