我的思路
这里有两个维度,所以一定要想好先排哪个维度!【一点自欺欺人的是:我至少想到了要先按照不同维度来排序,只不过是选错了维度T-T】
我一开始思路是想按照前面人数从小到大排,再按身高从小到大排【因为我认为0的一定排前面嘛,然后再往里面插人】
然后从人数为1的people i开始,再循环0-i之间满足条件的人数,然后插入。
但这里一定会有矛盾!举例如下
输入 [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
排完序 [[5,0],[7,0],[6,1],[7,1],[5,2],[4,4]]
依次输出如下:
[ [ 5, 0 ], [ 7, 0 ] ]
[ [ 5, 0 ], [ 7, 0 ], [ 6, 1 ] ]
[ [ 5, 0 ], [ 7, 0 ], [ 7, 1 ], [ 6, 1 ] ] !可以看到在这里就矛盾了!
[ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 7, 1 ], [ 6, 1 ] ]
[ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 7, 1 ], [ 6, 1 ] ]
[ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 7, 1 ], [ 6, 1 ] ]
所以说必须要按照身高从大到小排才能保证个子高的在前面啦。。
// 我的思路是错误的,必须按照身高先从大到小排,不然一定会矛盾。
var reconstructQueue = function(people) {
people.sort(function(a,b){
if(a[1]!==b[1]){
return a[1]-b[1]
}else{
return a[0]-b[0]
}
})
let que =[]
for(let i=0;i<people.length;i++){
if(people[i][1]===0){
que.splice(i,0,people[i])
continue
}
let count =0
for(let j=0;j<i;j++){
if(people[j][0]>=people[i][0]){
count++
}
if(count===people[i][1]){
//前面人数符合条件
que.splice(j+1,0,people[i])
break
}
console.log(que)
}
}
return que
};
正确思路
先按照身高从大到小排,再按照人数从小到大排!
// 跟正确答案相反的思路T-T我哭了
// 先按照身高从大到小来排,其次再按人数从小到大【我完全相反。。。】
var reconstructQueue = function(people) {
let que =[]
people.sort(function(a,b){
if(a[0]!==b[0]){
return b[0]-a[0]
}else{
return a[1]-b[1]
}
})
for(let i=0;i<people.length;i++){
que.splice(people[i][1],0,people[i]) //直接在people上插入会超时
}
return que
};
坑
JS里不能在原数组上直接splice,一定会超时!!
必须要新建一个空数组插入。