584 字
3 分钟
根据身高重建队列

题目描述
假设有打乱顺序的一群人站成一个队列,数组 people
表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki]
表示第 i
个人的身高为 hi
,前面 正好 有 ki
个身高大于或等于 hi
的人。
请你重新构造并返回输入数组 people
所表示的队列。返回的队列应该格式化为数组 queue
,其中 queue[j] = [hj, kj]
是队列中第 j
个人的属性(queue[0]
是排在队列前面的人)。
解题思路
- 排序预处理:
- 按身高(h)降序排序,同身高按k值升序排序
- 贪心插入:
- 初始化空结果队列
- 按排序顺序,将每人插入到其k值指定的索引位置
- 索引特性:
- 高个子先插入,不影响后续矮个子k值计数
- 同身高按k升序保证顺序正确性
- 动态调整:
- 插入操作自动维护队列顺序
- 后续插入不会破坏已有元素的k值条件
关键洞察
- 身高优先级:
- 高个子必须排在矮个子前面
- 矮个子插入不影响高个子k值
- k值本质:
- k值等于前面更高或等高的人数
- 队列位置由k值直接确定
- 排序稳定性:
- 同身高情况下,k值小者应在前
- 保证相同身高者的相对顺序
- 插入即满足:
- 已插入元素均满足条件
- 后续插入不会破坏已有约束
复杂度分析
指标 | 说明 |
---|---|
时间复杂度 | O(n²):排序O(n log n) + 插入O(n²) |
空间复杂度 | O(n):存储结果队列 |
最优情况 | O(n log n):当插入操作优化为O(1)时 |
代码实现
/** * @param {number[][]} people * @return {number[][]} */var reconstructQueue = function (people) { people.sort((a, b) => a[0] === b[0] ? a[1] - b[1] : b[0] - a[0]); const queue = []; people.forEach(p => queue.splice(p[1], 0, p)); return queue;};
实际应用场景
- 排队系统优化:机场VIP通道的优先级队列构建`
- 赛事分组:篮球比赛按身高分组排队入场`
- 军事编制:士兵按身高和资历列队`
- 数据可视化:金字塔形数据结构的层级构建`