第八天——贪心算法——队列重构问题

1. 题目

给定一个由人群组成的数组 people,其中每个人以 [hi, ki] 的形式表示,people[i] = [hi, ki] 表示第 i 个人的身高为 hi,并且前面恰好有 ki 个身高大于或等于 hi 的人。

你需要重新构造并返回一个表示队列的数组 queue,其中 queue[j] = [hj, kj] 是队列中第 j 个人的属性(queue[0] 是队列最前面的人)。

2. 分析

这个问题的解法是贪心算法,具体步骤如下:

  1. 排序 :先将所有人按照 h 从高到矮排序,如果 h 相同,则按照 k 从小到大排序。
  2. 插入 :从高到矮依次将每个人插入到队列的第 k 个位置上。因为矮的人不会影响到高的人的 k 值(即前面比 h 高或相等的数量)。

实现原理和解释

为什么排序?

  • h 从高到低排序 :这样在插入矮个子时,前面已经插入的都是比他高或相等的人,这样我们可以直接根据 k 值确定插入的位置。
  • k 从小到大排序 :如果 h 相同,k 小的人应该放在前面。

为什么插入到 k 的位置?

  • 已插入的人更高或等高 :所以对于当前要插入的 [h, k],前面的 k 个人的 h 都 ≥ 当前 h,所以要直接插入到 k 的位置。
  • 后续插入不影响 :后续插入的都是比当前 h 矮的人,不会影响当前的 k

为什么能正确构建队列?

  • 有序插入策略 :高的人先排好位置,矮的人插在前面不会影响高的人的 k 值。这样能确保每个人的前面恰好有 k 个 ≥ h 的人。

3. 完整代码

复制代码
def reconstructQueue(people):
    # 按 h 降序,如果 h 相同则按 k 升序 ------后插入的矮个子不会影响已插入的高个子的 k 值。
    people.sort(key=lambda x: (-x[0], x[1]))
    queue = []
    for p in people:
        queue.insert(p[1], p)  # 将 p 插入到列表 queue 的索引 p[1] 处
    return queue
print(reconstructQueue([[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]]

演示:

people = [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] 为例:

排序后 people = [[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]

遍历插入过程

当前 p k (插入位置) queue 变化 解释
[7,0] 0 [[7,0]] 插入到第 0 个位置,前面有 0 人 ≥ 7
[7,1] 1 [[7,0], [7,1]] 插入到第 1 位置,前面有 1 人 [7,0] ≥ 7
[6,1] 1 [[7,0], [6,1], [7,1]] 插入到第 1 位置,前面有 1 人 [7,0] ≥ 6
[5,0] 0 [[5,0], [7,0], [6,1], [7,1]] 插入到第 0 位置,前面有 0 人 ≥ 5
[5,2] 2 [[5,0], [7,0], [5,2], [6,1], [7,1]] 插入到第 2 位置,前面有 [7,0], [5,0] ≥ 5
[4,4] 4 [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] 插入到第 4 位置,前面有 [7,0], [5,0], [5,2], [6,1] ≥ 4

在 Python 中,`list.insert(index, element)` 方法不会覆盖原有元素 ,而是会将该索引位置及之后的元素自动后移一位,为新元素腾出空间。这是列表插入操作的核心特性。

相关推荐
Q741_14722 分钟前
每日一题 力扣 3655. 区间乘法查询后的异或 II 模拟 分治 乘法差分法 快速幂 C++ 题解
c++·算法·leetcode·模拟·快速幂·分治·差分法
The_Ticker23 分钟前
印度股票实时行情API(低成本方案)
python·websocket·算法·金融·区块链
夏乌_Wx27 分钟前
剑指offer | 2.4数据结构相关题目
数据结构·c++·算法·剑指offer·c/c++
AI成长日志1 小时前
【笔面试算法学习专栏】哈希表基础:两数之和与字母异位词分组
学习·算法·面试
abant21 小时前
leetcode 239 单调队列 需要一些记忆
算法·leetcode·职场和发展
漫霂2 小时前
二叉树的统一迭代遍历
java·算法
炽烈小老头2 小时前
【每天学习一点算法 2026/04/08】阶乘后的零
学习·算法
Mr_Xuhhh2 小时前
算法刷题笔记:从滑动窗口到哈夫曼编码,我的算法进阶之路
开发语言·算法
MicroTech20252 小时前
突破虚时演化非酉限制:MLGO微算法科技发布可在现有量子计算机运行的变分量子模拟技术
科技·算法·量子计算
盟接之桥2 小时前
盟接之桥®制造业EDI软件,打通全球供应链“最后一公里”,赋能中国制造连接世界
网络·安全·低代码·重构·汽车·制造