Leetcode 406-根据身高重建队列

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

在这里插入图片描述
在这里插入图片描述

题解

题解转载自Trump

【排序预处理+贪心】

套路:一般这种数对,还涉及排序的,根据第一个元素正向排序,根据第二个元素反向排序,或者根据第一个元素反向排序,根据第二个元素正向排序,往往能够简化解题过程。
方法:排序预处理+贪心

假设有打乱顺序 意味着原始的数组满足排序

第一个数字,第一优先级排序,由高到低,是为了用下标就能表示前面有几个元素比当前元素 大于等于
第二个数字,第二优先级排序,由低到高,当身高一样的时候,人数少的就应该放前面(正确性保障)
从 A 里挑身高最高的人 x 出来,插入到 B. 因为 B 中每个人的身高都比 x 要高,因此 x 插入的位置,就是看 x 前面应该有多少人就行了。比如 x 前面有 5 个人,那 x 就插入到队列 B 的第 5 个位置。

小的插到前面,其实不会对后面的大的造成影响,因为小的不参与第二位计数

时间复杂度:O(n^2)

空间复杂度:O(n)

class Solution {
    public int[][] reconstructQueue(int[][] people) {
        //注意本行写法
        Arrays.sort(people,(v1,v2)->(v1[0]!=v2[0]?v2[0]-v1[0]:v1[1]-v2[1]));
        List<int[]> res = new ArrayList<>();
        for(int[] person: people){
            res.add(person[1],person);
        }
        //注意本行写法
        return res.toArray(new int[res.size()][]);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值