假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
本题思路 高的人是看不见前面低的人 因此先按照 身高降序排列 接着在身高相同的时候 按照 k的升序排列
以本题给出例子为参考
排序之后如下: 7,0 7,1 6,1 5,0 5,2 4,4
先放入 7,0 7,1 接着要放入 6,1 1 代表其位置 所以: 7,0 6,1 ,7,1 接着放入 5,0
所以 5,0 7,0 6,1 ,7,1 依次类推 5,2 放入 在第二个位置
5,0 7,0 5,2 6,1 7,1 4,4 放入后 :
5,0 7,0 6,1 4,4 7,1 与预期相同
class Solution {
public int[][] reconstructQueue(int[][] people) {
// h 是这个人的身高 ,k是其前面 且身高不比其低 的人数
//将h递减排序 将k按递增排序
// o【0】代表h身高 o【1】 代表 k前面的人
Arrays.sort(people, new Comparator<int[]>() {
@Override
public int compare(int[] o1, int[] o2) {
// if the heights are equal, compare k-values
return o1[0] == o2[0] ? o1[1] - o2[1] : o2[0] - o1[0];
}
});
List<int[]> output = new LinkedList<>();
// 按照k放入列表 索引等于它们的 k 值
//先放入的是 身高最高的,并且其位置 等于 他的k 值 即 p【1】
for(int[] p : people){
output.add(p[1], p);
}
//转为数组即可
int n = people.length;
return output.toArray(new int[n][2]);
}
}