「每日LeetCode」2020年11月16日

本文最后更新于:2023年3月19日 晚上

Lt406. 根据身高重建队列

406. 根据身高重建队列

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
注意:
总人数少于 1100 人。
示例

1
2
3
4
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]

思路

关键是发现以下规律:对已排好的高身高中插入矮身高得到的结果仍然是符合要求的
所以先执行排序,则可以保证之后遍历插入顺序符合先插高个子再插矮个子的要求:按身高降序,相同升高按人数升序
排序后,k 是排在 h 前面且身高大于或等于 h 的人数 ,因为先插入了高个子。此时结果数组中所有人身高都大于等于当前人的身高,所以k即为需要插入的位置的下标

解答

1
2
3
4
5
6
7
8
9
10
/**
* @param {number[][]} people
* @return {number[][]}
*/
var reconstructQueue = function (people) {
const res = [];
people.sort((a, b) => (a[0] === b[0] ? a[1] - b[1] : b[0] - a[0]));
people.forEach((item) => res.splice(item[1], 0, item));
return res;
};