Leetcode 406-根据身高重建队列

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

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

Leetcode 406-根据身高重建队列_第1张图片
Leetcode 406-根据身高重建队列_第2张图片

题解

题解转载自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 res = new ArrayList<>();
        for(int[] person: people){
            res.add(person[1],person);
        }
        //注意本行写法
        return res.toArray(new int[res.size()][]);
    }
}

你可能感兴趣的:(算法,算法)