持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情
1.题目
假设有打乱顺序的一群人站成一个队列,数组 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]]
2.思路
本题需要我们将队列重新排序并按照数组中的前置人数来进行排序,不光光是按照身高从大到小排序,还需要考虑到人的前置人数是否满足。所以我们可以首先将数组按照身高进行降序排序,然后我们开始考虑第二个条件前置人数的问题。我们可以考虑一个问题第二个前置人数是ki个身高大于或等于hi的人,由于我们先插入高的人,那么此时前置人数也应该就是数组的插入位置,而此时还有个问题就是身高相等时先处理前置人数大的还是先插入前置人数小的,由于身高相同,那么就意味着大于第一个的也就大于第二个,而前置人数小的则会要求出现在数组中更前方的位置。
首先我们需要对传入的数组进行排序,按照身高降序排列,然后相同之人按照前置人数进行升序排列,然后就开始插入操作,将数组中的每一个元素按照他们的前置人数插入到数组中的对应位置。
3.代码
var reconstructQueue = function(people) {
people.sort((a,b)=>{
return a[0]===b[0]?a[1]-b[1]:b[0]-a[0]
})
let res = []
people.forEach(item=>{
res.splice(item[1],0,item)
})
return res
};