Skip to content
On this page

根据身高重建队列

Question

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

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

image-20230618110411517

思路

如果在解题过程中遇到了两个维度都需要去考虑的情况,不要同时去考虑,选一个维度考虑

如果两个维度都去考虑的话一定会顾此失彼

如果不确定选择哪一个维度,可以两个维度分别模拟一遍

如果按照k来从小到大排序,排完之后,会发现k的排列并不符合条件,身高也不符合条件,两个维度哪一个都没确定下来。

那么按照身高h来排序呢,身高一定是从大到小排(身高相同的话则k小的站前面),让高个子在前面。

此时我们可以确定一个维度了,就是身高,前面的节点一定都比本节点高!

那么只需要按照k为下标重新插入队列就可以了

js
var reconstructQueue = function(people) {
    people = people.sort((a,b)=>{           //按身高由高到低排序
        if(a[0] === b[0])   return a[1]<b[1]?-1:1	//如果身高相同,ki 小的人在前
        else return a[0]>b[0]?-1:1
    }) 
    console.log(people)
    let position 
    let queue = []
    for(let i=0;i<people.length;i++){           //遍历
       position = people[i][1]	
       queue.splice(position,0,people[i])		//JS 在数组指定位置插入/删除/替换数据的方法
    }
    return queue
};