LeetCode 高级 - Queue Reconstruction by Height

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;
        }
    }

猜你喜欢

转载自blog.csdn.net/whdalive/article/details/80480877