406.根据身高重建队列

165 阅读3分钟

题目介绍

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

示例 1:

输入:people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]

输出:[[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]]

解释:

编号为 0 的人身高为 5 ,没有身高更高或者相同的人排在他前面。

编号为 1 的人身高为 7 ,没有身高更高或者相同的人排在他前面。

编号为 2 的人身高为 5 ,有 2 个身高更高或者相同的人排在他前面,即编号为 0 和 1 的人。

编号为 3 的人身高为 6 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。

编号为 4 的人身高为 4 ,有 4 个身高更高或者相同的人排在他前面,即编号为 0、1、2、3 的人。

编号为 5 的人身高为 7 ,有 1 个身高更高或者相同的人排在他前面,即编号为 1 的人。

因此 [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] 是重新构造后的队列。

示例 2:

输入:people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]]

输出:[[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]

提示:

1 <= people.length <= 2000

0 <= hi <= 10^6

0 <= ki < people.length

题目数据确保队列可以被重建.

题目分析

  1. 首先我们得明白题目中数组中每项代表的意思。 people[i] = [hi, ki]: 表示第 i 个人的 身高 为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

  2. 我们期望得到什么结果?

    我们希望得到一个新的序列,该序列中,每一项对应的 hi 和 ki 在序列中都应该是正确的,即每一项都能正确表示身高为 hi 的人,前面有 ki 个人。

思路分析

对于这种需要考虑多个维度的题目,我们不能多个维度同时考虑,这样很容易形成十分混乱的情况。遇到通过多个维度去确定一个新的序列的情况,我们应该一个一个维度确定,先确定一个维度之后,在该结果的基础上再进行下一个维度的确定。

重点

本题有两种维度,身高和人数。那我们应该先按照什么维度来进行排序呢?

  1. 先按照人数来进行排序,以 **people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]**为例:

    按照人数进行降序排序便是:[[7,0],[5,0],[7,1],[6,1],[5,2],[4,4]]

    这样排序身高没有确定下来,人数也不对。所以,先按照人数进行排序不行。

  2. 先按照身高来进行排序,以**people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]**为例:

    按照人数进行降序排序便是:[[7,0],[7,1],[6,1],[5,0],[5,2],[4,4]]

    这样排序,至少我们身高是确定下来的。再此基础上,我们再对人数进行插入排序。

代码

function reconstructQueue(people: number[][]): number[][] {
    let result:number[][]=[];
    //根据身高进行降序排序
    people.sort((a, b ) => {
        if(b[0] !== a[0]) {
            return b[0] - a[0]
        } else {
            //身高一致时,根据人数进行升序排序
            return a[1] - b[1]
        }

    })

    for(let k=0;k<people.length;k++){
        result.splice(people[k][1], 0, people[k]);
    }

    return result;
};

总结

以上便是根据身高重建队列的全部内容,如有错误之处,欢迎大家留言指出,谢谢大家了。