【LeetCode】Day144-根据身高重建队列

题目

406. 根据身高重建队列【中等】

题解

【套路】:一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。

对于这道题,我们先按照身高从大到小排序(身高相同的情况下K小的在前面),这样的话,排队时,轮到他的时候,比他高或者相等的已经排好了,他就可以根据K插进去了。假如K=2,排好的队列已经有4个人了,这四个人都比他高,所以他只需要插在第2位后面即可。

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        int n=people.length;
        //people按身高降序,k升序排序
        Arrays.sort(people,new Comparator<int[]>(){
            public int compare(int[] person1,int[] person2){
                if(person1[0]!=person2[0])
                    return person2[0]-person1[0];//按第一元素降序
                else
                    return person1[1]-person2[1];//按第二元素升序
            }});
        
        List<int[]>list=new ArrayList<>();
        for(int[] person:people){
            //已经排队的人数少于比我高的人数,先排在最后
            if(person[1]>=list.size())
                list.add(person);
            //已经排队的人数多于比我高的人数,插到比我高的人数之后
            else
                list.add(person[1],person);
        }
        return list.toArray(new int[list.size()][]);
    }
}

时间复杂度: O ( n 2 ) O(n^2) O(n2) O ( n l o g n ) O(nlogn) O(nlogn)的时间进行排序,随后需要 O ( n 2 ) O(n^2) O(n2)遍历每个人并放入队列。

空间复杂度: O ( l o g n ) O(logn) O(logn),排序需要的空间。

p.s 昨天实验室活动鸽掉一天,这周结束生日也就算过完啦,祝新一岁的自己更加坚定沉着、脚踏实地,努力做让父母骄傲的人!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值