leetcode 406
身高重建
public static int[][] reconstructQueue(int[][] people){
int[][] result = null;
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
if(o1[0]==o2[0]) return o1[1]-o2[1];
return o2[0]-o1[0];
}
});//先排序,其实已经是一次贪心,身高值大的在前面
LinkedList<int[]> que = new LinkedList<>();
for(int i=0;i<people.length;i++){
int pos= people[i][1];
que.add(pos,people[i]);//pos其实就是当时要插的位置,不影响后边的
}
result = que.toArray(new int[people.length][]);
return result;
}
leetcode 452
最少箭爆气球
public static int findMinArrowShots(int[][] points){
int result =0;
Arrays.sort(points, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
/* if (o1[0] == o2[0]) {
if (o1[1] > o2[1])
return 1;
else if (o1[1] < o2[1])
return -1;
else
return 0;
}
if (o1[0] > o2[0])
return 1;
else if (o1[0] < o2[0])
return -1;
else
return 0;*/ //上边这是造轮子
return Integer.compare(o1[0],o2[0]);//int o1-o2可能超范围,这样简单点
}
});
/* for(int i=0;i<points.length;i++){
result++;
int end = points[i][1];
int start=points[i][0];
for(int j=i+1;j<points.length;j++){
if(points[j][0]<=end){
end=Math.min(end,points[j][1]);
}
start = Math.max(start,points[j][0]);
if(start>end){
break;
}
i++;// i是可以增长的,所以双层循环 实际执行发现效率跟下边的单层循环方法也不差
}
}*/
for(int i=0;i<points.length-1;i++){
if (points[i + 1][0] >points[i][1]) { // 气球没有挨上
result++;// 需要一只箭
}else{
points[i+1][1]=Math.min(points[i][1],points[i+1][1]);// 更新最小右边界
}
}
return ++result;
}