LeetCode - 406

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。

406 Queue Reconstruction by Height 根据身高重建队列

注意:

总人数少于1100人。

示例

1
2
3
4
5
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

思路

我们先观察这一组数据[3,0][3,1][2,1],如果我们先按顺序一个一个来,先得到[3.0],[3,1]这样的数据,再插入的[2,1]的时候要插入到[3,0][3,1]之间,而不是[3,1]之后。

我们发现,当我们插入的h值小于已存在的h值时,无论插哪个位置都可以。
所以,当我们按h值降序排列,k值升序排列之后,在按下标插入即可。

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public int[][] reconstructQueue(int[][] people) {
int len = people.length;
if(len<2) return people;
Arrays.sort(people, (a, b) -> (a[0] == b[0] ? a[1] - b[1] : b[0] - a[0]));
/*Arrays.sort(people,new Comparator<int[]>(){
@Override
public int compare(int[] o1, int[] o2) {
return o2[0]==o1[0]?o1[1]-o2[1]:o2[0]-o1[0];
}
});*/
List<int[]> queue = new ArrayList<>();
for (int[] p : people) {
queue.add(p[1], p);
}
return queue.toArray(new int[queue.size()][]);
}

惊奇的发现,同样的代码,只是用了lambda表达式,在LeetCode上的速度就会慢5倍左右。