406(本文给出了)。高度排队重建

时间:2017-01-14 18:45:34

标签: javascript algorithm

以下是问题:

https://leetcode.com/problems/queue-reconstruction-by-height/

假设您有一个站在队列中的随机人员列表。每个人用一对整数(h,k)来描述,其中h是人的高度,k是这个人的高度大于或等于h的人数。编写一个算法来重建队列。

注意: 人数不到1,100。

示例:

Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

以下是我使用javascript的答案:

var reconstructQueue = function(people) {
var result= [];
people.sort((a,b)=>a[1]-b[1]).sort((a,b)=>b[0]-a[0]);
for(var i=0; i<people.length; i++) {
    result.splice(people[i][1], 0, people[i]);
}
return result;
};

它可以通过上面的测试,但为什么它没有通过Leetcode中的所有测试?有人能帮助我吗?

3 个答案:

答案 0 :(得分:1)

您正在应用排序两次并且它不正确,因为您第一次按1索引排序队列然后按0索引排序。如果a和b具有相同的高度或按0索引排序,如果它们具有不同的高度,则必须对队列进行一次排序并按1索引排序 你的排序功能将是

people.sort(function(a,b){
    if(a[0]==b[0]){
        return a[1]-b[1];
    }
    else{
        return b[0]-a[0];
    }
});

使用箭头功能

people.sort((a,b)=>a[0]==b[0]?a[1]-b[1]:b[0]-a[0]);

答案 1 :(得分:0)

您需要一个更好的排序函数,并将第一个索引0降序排序,索引1升序。

people.sort((a, b) => b[0] - a[0] || a[1] - a[1]);

ES5

&#13;
&#13;
var reconstructQueue = function(people) {
        var result = [];
        people.sort(function (a, b) {
            return b[0] - a[0] || a[1] - a[1];
        });
        for (var i = 0; i < people.length; i++) {
            result.splice(people[i][1], 0, people[i]);
        }
        return result;
    },
    data = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]],
    result = reconstructQueue(data);

console.log(JSON.stringify(result)); // [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
&#13;
&#13;
&#13;

ES6

&#13;
&#13;
var reconstructQueue = function(people) {
        var result = [];
        people.sort((a, b) => b[0] - a[0] || a[1] - a[1]);
        for (var i = 0; i < people.length; i++) {
            result.splice(people[i][1], 0, people[i]);
        }
        return result;
    },
    data = [[7, 0], [4, 4], [7, 1], [5, 0], [6, 1], [5, 2]],
    result = reconstructQueue(data);

console.log(JSON.stringify(result)); // [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
&#13;
&#13;
&#13;

答案 2 :(得分:0)

这是我的解决方案,运行时间为88毫秒。

// sort people by height ASC, then sort people by order DESC
const sortPeople = (a, b) => {
  if (a[0] === b[0]) {
    return a[1] - b[1];
  } else {
    return b[0] - a[0];
  }
}

const reconstructQueue = (people) => {
  const output = [];

  people.sort(sortPeople);

  people.forEach(p => output.splice(p[1], 0, p));

  return output;
};