根据身高重建队列

根据身高重建队列

https://leetcode.cn/problems/queue-reconstruction-by-height/description/

图 0

思路

这里的队列顺序很明显取决于两个关键因素。h和k,因此现根据一个因素排序,接着再根据另外一个因素进行调整。

如果先按照k进行排序,会发现k不符合条件,身高也不符合条件。
因此需要先按照h进行排序,排序完成后在根据身高依次遍历每一个数组,并根据k调整位置即可。

要注意第一次排序,身高降序排列,如果身高相同,根据k值升序排。这是为了后续调整插入队列时可以根据k直接确定位置。

图 1

按照身高排序之后,优先按身高高的people的k来插入,后序插入节点也不会影响前面已经插入的节点,最终按照k的规则完成了队列。

所以在按照身高从大到小排序后:

局部最优:优先按身高高的people的k来插入。插入操作过后的people满足队列属性

全局最优:最后都做完插入操作,整个队列满足题目队列属性

局部最优可推出全局最优,找不出反例,那就试试贪心。

求解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var reconstructQueue = function (people) {
let queue = []
//这段代码的排序规则是:
//首先按照身高h降序排序,也就是说,身高高的人会排在身高低的人前面。
//如果身高h相同,那么按照k值升序排序,也就是说,k值小的人会排在k值大的人前面。
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
}

arr.splice()

splice() 是 JavaScript 中数组对象的一个方法,用于在数组中添加、删除或替换元素。

splice() 方法接受三个参数:

  • start:开始修改的位置(索引)。
  • deleteCount:要删除的元素数量。如果省略或大于 start 之后的元素数量,那么 start 之后的所有元素都会被删除。
  • item1, item2, …:要添加到数组中的元素。这些元素将被添加到 start 参数指定的位置。如果省略这些参数,splice() 将只删除元素。

如果你想在数组中插入元素,你可以使用splice()方法,并将要删除的元素数量设置为0,然后提供要插入的元素。例如:

1
2
3
let arr = [1, 2, 3];
arr.splice(1, 0, 'a'); // 在索引1的位置插入'a'
console.log(arr); // 输出:[1, 'a', 2, 3]

如果你想从数组中删除元素,你可以使用splice()方法,并提供要删除的元素的开始位置和数量,不需要提供要插入的元素。例如:

1
2
3
let arr = [1, 2, 3];
arr.splice(1, 1); // 从索引1的位置删除1个元素
console.log(arr); // 输出:[1, 3]

如果你想替换数组中的元素,你可以使用splice()方法,并提供要替换的元素的开始位置和数量,以及要插入的新元素。例如:

1
2
3
let arr = [1, 2, 3];
arr.splice(1, 1, 'a'); // 从索引1的位置删除1个元素,并插入'a'
console.log(arr); // 输出:[1, 'a', 3]