Queue Reconstruction by Height
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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升序排列,然后只需要依次将每个人插在k的位置上即可。也就是除了排序以外,只需要一次遍历。
思想也很容易理解,对于相同身高的人,人数大的必定在人数小的人的后面,且插入到位置k时,前面比他高(包括同身高)的人数等于k个。而k值相同时,会将身高高的人“挤”到后面去,同样满足其前面身高大于该人的人数为k个。
代码
class Solution {
//按照身高降序,人数升序排列
//将每个人插在k的位置上
// 7/0->7/0,7/1->7/0,6/1,7/1->5/0,7/0,6/17/1->5/0,7/0,5/2,6/1,7/1->5/0,7/0,5/2,6/1,4/4,7/1
public int[][] reconstructQueue(int[][] people) {
Arrays.sort(people,new Comparator<Object>(){
@Override
public int compare(Object o1,Object o2){
int[] first = (int[]) o1;
int[] second = (int[]) o2;
if(first[0]>second[0]){
return -1;
}else if(first[0]<second[0]){
return 1;
}else {
if(first[1]>second[1]){
return 1;
}else if(first[1]<second[1]){
return -1;
}else return 0;
}
}
});
List<int[]> list = new ArrayList<>();
for(int i=0;i<people.length;i++){
list.add(people[i][1],people[i]);
}
int[][] res = new int[people.length][2];
for(int i=0;i<list.size();i++){
res[i] = list.get(i);
}
return res;
}
}