LeetCode #406 根据身高重建队列 贪心

LeetCode #406 根据身高重建队列

题目描述

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (h, k) 表示,其中h是这个人的身高,k 是排在这个人前面且身高大于或等于 h 的人数。 编写一个算法来重建这个队列。

注意:
总人数少于1100人。

示例

输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
思路分析:贪心

可以想到用插入比较好解决,就是前面的 “顺序序列“ 怎么构造的问题

  1. 如果身高较小的先做插入的话,那当出现需要身高高的插入的话可能出现原先正确插入的第 k 个位置变成了 k+1,顾此失彼
  2. 身高较高的先做插入,那显然是身高用降序,个数用升序,这时可以用数组的下标来表示前面有多少个人来巧妙的插入

可以看图来理解这个问题 根据身高重建队列

class Solution:
    def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
        if not people: return []
        people.sort(key = lambda x: (-x[0], x[1]))
        res = []
        for i in people:
            res.insert(i[1], i)
        return res
  • 时间复杂度: O ( N 2 ) O(N^2) O(N2):排序用了 O ( N l o g N ) O(NlogN) O(NlogN) 的时间,每个人插入队列需要 O ( k ) O(k) O(k) 的时间,其中 k k k 是当前输出队列的元素个数。总共的时间复杂度为 O ( ∑ k = 0 N − 1 k ) = O ( N 2 ) O(\sum\limits_{k=0}^{N-1}k)=O(N^2) O(k=0N1k)=O(N2)
  • 空间复杂度: O ( N ) O(N) O(N):输出队列使用的空间
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值