题目描述
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/c3d31d18c6b3de7ec0e7347c18192857.png)
题目分析
- 这道题就是将原本排好的队列在打乱后整理恢复原状
- 第一个数
h
代表身高,第二个数k
代表这个人之前有几个身高更高或相等的人数
解法分析
- 可以知道,
k
只跟身高更高的人相关,跟身高较矮的人没有关系 - 所以可以先按照身高降序排序,如果身高相同就根据第二个数升序排序
- 那这样排好序之后,逐个遍历,放到结果队列中
- 因为身高已经是从高到低了,那么插入的时候主要是根据
k
- 如果
k=2
,就代表前面有两个更高的人,假设之前已经插入了n
个人了,这n
个人肯定都是比当前这个人更高的,那么直接插入到索引为2
的位置即可,即:0
和1
的身高比2
更高或相等 - 可参考《官方题解》的算法图解
代码
class Solution {
public int[][] reconstructQueue(int[][] people) {
if (people == null || people.length == 0 || people[0].length == 0) {
return new int[0][0];
}
Arrays.sort(people,(a,b) -> (a[0] == b[0] ? a[1]-b[1] : b[0]-a[0]) );
List<int[]> queue = new ArrayList<>();
for(int[] p : people){
queue.add(p[1], p);
}
return queue.toArray(new int[queue.size()][]);
}
}