假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
这题完全是看别人的代码怎么做的,至于为什么这么做,道理在哪里,自己其实也想不通。。
1.身高降序排列,k值升序排列
2.创建一个新的二维数组,一个个的往里面插入已排好序的值,策略是:依次按照k的值作为索引插入到相应的位置。
这样做保证了两点:
1.相同身高的,k值大的会被插入到k值小的后面。
2.k值相同的,身高矮的被插入到前面。因为已按要求排好序。
其实仔细想想,这也正满足了题目重建队列的要求。。。
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<int[]>();
for(int[] p:people) {
queue.add(p[1], p);
}
return queue.toArray(new int[queue.size()][]);
}