思路分析:
目标:前面正好有ki个身高大于或等于hi的人
1.前面大于或等于hi,也就是前面的hi大,hi要降序排列,然后根据ki的值找位置插入
2.那么hi降序排列后,谁先执行插入操作呢?当k的值相同时,自然是h值大的先插入;
当h的值相同时,则是k的值越小越先插入,因为k的值代表前面有几个人,因此ki要在hi降序排列的基础上升序排列
举例:
以 `people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]` 为例:
1. 排序:
按身高 \( h \) 降序、同身高按 \( k \) 升序排序后,数组变为 `[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]]`。
2. 插入构建队列:
- 第一个元素 `[7,0]`,插入到 \( 0 \) 位置,结果 `res = [[7,0]]`。
- 第二个元素 `[7,1]`,插入到 \( 1 \) 位置,结果 `res = [[7,0], [7,1]]`。
- 第三个元素 `[6,1]`,插入到 \( 1 \) 位置,结果 `res = [[7,0], [6,1], [7,1]]`。此时 `[6,1]` 前面有 \( 1 \) 个身高 ≥ \( 6 \) 的元素(`[7,0]`),符合 \( k = 1 \)。
- 第四个元素 `[5,0]`,插入到 \( 0 \) 位置,结果 `res = [[5,0], [7,0], [6,1], [7,1]]`。`[5,0]` 前面有 \( 0 \) 个身高 ≥ \( 5 \) 的元素,符合 \( k = 0 \)。
- 第五个元素 `[5,2]`,插入到 \( 2 \) 位置,结果 `res = [[5,0], [7,0], [5,2], [6,1], [7,1]]`。`[5,2]` 前面有 \( 2 \) 个身高 ≥ \( 5 \) 的元素(`[5,0]`、`[7,0]`),符合 \( k = 2 \)。
- 第六个元素 `[4,4]`,插入到 \( 4 \) 位置,结果 `res = [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]`。`[4,4]` 前面有 \( 4 \) 个身高 ≥ \( 4 \) 的元素(`[5,0]`、`[7,0]`、`[5,2]`、`[6,1]`),符合 \( k = 4 \)。
最终重建的队列 `[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]`,通过将每个元素插入到 \( k_i \) 位置,确保了前面身高不小于 \( h_i \) 的人数正好是 \( k_i \),从而满足题目要求。
伪代码:
对数组进行排序:按照 h 降序,h 相同则 k 升序 初始化结果列表 res 遍历排序后的每个元素 (h, k): 将 (h, k) 插入到 res 的第 k 个位置 返回 res
代码:
class Solution:
def reconstructQueue(self, people: list[list[int]]) -> list[list[int]]:
# 按照身高 h 降序,k 升序排序
people.sort(key=lambda x: (-x[0], x[1]))
res = []
for h, k in people:
# 将 (h, k) 插入到 res 的第 k 个位置
res.insert(k, [h, k])
return res