406. 根据身高重建队列-中等-脑筋急转弯
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
题解
这题标签里面带脑筋急转弯就很离谱,不过确实想不出来,只能想到按h
和k
分别排序,怎么插入就想不到这么巧妙了。
附题解的一个解析,几句话就知道怎么做了:
/**
* 解题思路:先排序再插入
* 1.排序规则:按照先H高度降序,K个数升序排序
* 2.遍历排序后的数组,根据K插入到K的位置上
*
* 核心思想:高个子先站好位,矮个子插入到K位置上,前面肯定有K个高个子,矮个子再插到前面也满足K的要求
*
// [7,0], [7,1], [6,1], [5,0], [5,2], [4,4]
// 再一个一个插入。
// [7,0]
// [7,0], [7,1]
// [7,0], [6,1], [7,1]
// [5,0], [7,0], [6,1], [7,1]
// [5,0], [7,0], [5,2], [6,1], [7,1]
// [5,0], [7,0], [5,2], [6,1], [4,4], [7,1]
* @param people
* @return
*/
class Solution {
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people, (o1,o2) -> {
return o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0];
});
List<int[]> list = new ArrayList<int[]>(people.length);
for(int[] person : people){
list.add(person[1], person);
}
return list.toArray(new int[people.length][2]);
}
}