python身高排序

 思路分析:

目标:前面正好有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  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值