思路:来自力扣官方(因为没看懂题目,所以...直接看了答案)
(1)对于两个人i和j,如果i的身高大于j的身高,那么j的站位对于i是没有任何影响的,因为站队的唯一要求是i前面有k个人比i高。因此从个子高的人开始排列是比较好的做法。
(2)首先将个子高的人排好顺序之后,接下来的排列工作不需要修改已经排好队的人的相对位置,所以就变成了“在当前排列中寻找第i个人位置”的问题。
整体流程就是:首先将所有人根据身高降序排列,同一身高分组的人按照k升序排列;队列置为空,依次在当前队列中寻找k个位置插入,最终得到的队列就是答案。
ps. 两个排序过程可以合并为一个,简便方法就是利用arrays.sort,传入自定义的comparator;另外,由于插入操作很多,答案可以先采用linkedlist存放,最后toarray。
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
return o1[0]==o2[0]?o1[1]-o2[1]:o2[0]-o1[0];
}
});
LinkedList<int[]> answer=new LinkedList<>();
for (int[] p:people){
answer.add(p[1],p);
}
return answer.toArray(new int[people.length][2]);
}