题目介绍
假设有打乱顺序的一群人站成一个队列,数组 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
题目数据确保队列可以被重建.
题目分析
-
首先我们得明白题目中数组中每项代表的意思。 people[i] = [hi, ki]: 表示第 i 个人的 身高 为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。
-
我们期望得到什么结果?
我们希望得到一个新的序列,该序列中,每一项对应的 hi 和 ki 在序列中都应该是正确的,即每一项都能正确表示身高为 hi 的人,前面有 ki 个人。
思路分析
对于这种需要考虑多个维度的题目,我们不能多个维度同时考虑,这样很容易形成十分混乱的情况。遇到通过多个维度去确定一个新的序列的情况,我们应该一个一个维度确定,先确定一个维度之后,在该结果的基础上再进行下一个维度的确定。
重点
本题有两种维度,身高和人数。那我们应该先按照什么维度来进行排序呢?
-
先按照人数来进行排序,以 **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]]
这样排序身高没有确定下来,人数也不对。所以,先按照人数进行排序不行。
-
先按照身高来进行排序,以**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;
};
总结
以上便是根据身高重建队列的全部内容,如有错误之处,欢迎大家留言指出,谢谢大家了。