链接: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;
};