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

题目描述#

假设有打乱顺序的一群人站成一个队列,数组 people 表示队列中一些人的属性(不一定按顺序)。每个 people[i] = [hi, ki] 表示第 i 个人的身高为 hi ,前面 正好 有 ki 个身高大于或等于 hi 的人。

请你重新构造并返回输入数组 people 所表示的队列。返回的队列应该格式化为数组 queue ,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是排在队列前面的人)。

解题思路#

  1. 排序预处理
    • 按身高(h)降序排序,同身高按k值升序排序
  2. 贪心插入
    • 初始化空结果队列
    • 按排序顺序,将每人插入到其k值指定的索引位置
  3. 索引特性
    • 高个子先插入,不影响后续矮个子k值计数
    • 同身高按k升序保证顺序正确性
  4. 动态调整
    • 插入操作自动维护队列顺序
    • 后续插入不会破坏已有元素的k值条件

关键洞察#

  1. 身高优先级
    • 高个子必须排在矮个子前面
    • 矮个子插入不影响高个子k值
  2. k值本质
    • k值等于前面更高或等高的人数
    • 队列位置由k值直接确定
  3. 排序稳定性
    • 同身高情况下,k值小者应在前
    • 保证相同身高者的相对顺序
  4. 插入即满足
    • 已插入元素均满足条件
    • 后续插入不会破坏已有约束

复杂度分析#

指标说明
时间复杂度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;
};

实际应用场景#

  1. 排队系统优化:机场VIP通道的优先级队列构建`
  2. 赛事分组:篮球比赛按身高分组排队入场`
  3. 军事编制:士兵按身高和资历列队`
  4. 数据可视化:金字塔形数据结构的层级构建`

相似题目#

根据身高重建队列
https://website-truelovings-projects.vercel.app/posts/algorithms/根据身高重建队列/
作者
欢迎来到StarSky的网站!
发布于
2025-08-21
许可协议
CC BY-NC-SA 4.0