假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
注意:
总人数少于1100人。示例:
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
class Solution {
public int[][] reconstructQueue(int[][] people) {
}
}
队列中每一个人都能够知道身高≥自己且排在前面的人数(K值)…
当一个人插入这个队列时,只需要在意前面的有几个身高≥自己的就行。如果插入之前,这个队列的身高全都是 ≥ 自己的,那么只需要根据自己的K值插入指定位置就可以了,这时候是满足条件的;
后面插入的人身高只要满足 ≤ 队列的所有人,那么就可以用上述方法,所以我们需要实现一个能从高到低插入的队列。
public int[][] reconstructQueue(int[][] people) {
//将people进行排序(身高降序,身高相等则K升序)
Arrays.sort(people,(people0,people1)->{
return people0[0] == people1[0] ? people0[1] - people1[1] : people1[0] - people0[0];
});
//新建一个队列,从高到低逐一插入(people的排序保证每次插入之前,队列是没有低于插入值的)
LinkedList<int[]> list = new LinkedList();
for(int[] p : people){
//根据K值插入到指定的位置
list.add(p[1],p);
}
//链表转化数组
return list.toArray(new int[list.size()][]);
}
莫得,只知解法,不知怎么想到,脑废了。