js.根据身高重建队列

链接:406. 根据身高重建队列 - 力扣(LeetCode)

题目:

假设有打乱顺序的一群人站成一个队列,数组 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 <= 106
    • 0 <= ki < people.length
    • 题目数据确保队列可以被重建

    思路:

    对于身高最小的人,如果他前面有k个人身高大于自己,那么他应该排在位置k(数组从0开始数)。

    那么对于身高第二小的(假设为[h2, k2])也可以以此类推。因为前面排过的都是身高小于自己的,所以应该忽略掉排过的,他的位置就应该是第k2个空位置

    我的做法是将所有人按身高进行排序,这样就可以从身高最小的人开始计算,如果身高相同,按照ki的大小来排,计算出array2D的值。如下是例1中的array2D值。

    接下来,就按照array2D数组的顺序,依次排序。

    代码:

    /**
     * @param {number[][]} people
     * @return {number[][]}
     */
    var reconstructQueue = function(people) {
        let array2D = Array(people.length).fill().map(() => [])
        let newArr = Array(people.length).fill().map(() => [-1,-1])
        let flag = 0
        //求出array2D数组
        for(let i = 0 ; i < people.length ; i++ ){
            for(let j = i+1 ; j < people.length ; j++ ){
                if(people[i][0]>=people[j][0]){
                    if(people[i][0]==people[j][0]&&people[i][1]<people[j][1]){ continue }
                    let t = people[i]
                    people[i] = people[j]
                    people[j] = t
                }
            }
            if( flag!=0 && people[i][0]==array2D[flag-1][0][0] ){
                array2D[flag-1].push(people[i])
            }else {
                array2D[flag].push(people[i])
                flag++
            }
        }
        for(let i = 0 ; i < flag ; i++ ){
            let n = array2D[i].length-1
            for(let j = n ; j >= 0 ; j-- ){
                for(let k = 0,count = 0 ; k < newArr.length ; k++ ){
                    if(newArr[k][0]==-1){
                        if(count==array2D[i][j][1]){
                            newArr[k] = array2D[i][j]
                            break
                        }else{
                            count++
                        }
                    }
                }
            }
        }
        return newArr
    };

    题解看到的更好解法:

    1,先排序,身高高的在前面,身高相同的话,ki更小的排前面。

    var reconstructQueue = function(people) {
        let queue = [];
        // 排序
        people.sort((a, b) => {
            if (b[0] !== a[0]) {
                return b[0] - a[0];
            } else {
                return a[1] - b[1];
            }
        });
        // 插入队列
        for (let i = 0; i < people.length; i++) {
            queue.splice(people[i][1], 0, people[i]);
        }
        return queue;
    };

    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

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

    抵扣说明:

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

    余额充值