以下是问题:
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中的所有测试?有人能帮助我吗?
答案 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
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;
ES6
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;
答案 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;
};