image.png

我的思路

这里有两个维度,所以一定要想好先排哪个维度!【一点自欺欺人的是:我至少想到了要先按照不同维度来排序,只不过是选错了维度T-T】
我一开始思路是想按照前面人数从小到大排,再按身高从小到大排【因为我认为0的一定排前面嘛,然后再往里面插人】
然后从人数为1的people i开始,再循环0-i之间满足条件的人数,然后插入。
但这里一定会有矛盾!举例如下

  1. 输入 [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
  2. 排完序 [[5,0],[7,0],[6,1],[7,1],[5,2],[4,4]]
  3. 依次输出如下:
  4. [ [ 5, 0 ], [ 7, 0 ] ]
  5. [ [ 5, 0 ], [ 7, 0 ], [ 6, 1 ] ]
  6. [ [ 5, 0 ], [ 7, 0 ], [ 7, 1 ], [ 6, 1 ] ] !可以看到在这里就矛盾了!
  7. [ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 7, 1 ], [ 6, 1 ] ]
  8. [ [ 5, 0 ], [ 7, 0 ], [ 5, 2 ], [ 7, 1 ], [ 6, 1 ] ]
  9. [ [ 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,一定会超时!!
必须要新建一个空数组插入。