美文网首页
根据身高重建队列

根据身高重建队列

作者: Houtasu | 来源:发表于2019-06-13 17:49 被阅读0次

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]

解题思路
这道题是贪婪算法的题目,从队列中依次取出每个人,然后找他们的位置就可以了。
但我们需要按照身高降序来确定排队的次序,因为这样对于矮的人来说,比他高的人是已经确定了的。
比如我们排好了前两个人的顺序
[[7, 0], [4,4]]
现在需要安排第三个人[7, 1]
你知道[7,1]在[7, 0]的后面,但是应该在[4,4]的前面还是后面呢?
你无法确定,因为如果[7,1 ]在[4, 4]前面,你不知道[4, 4]后面排序的人中,会不会有3个人插到他的前面去,这样[7, 1]的位置可能就错了。
但是如果按照身高降序后,[4, 4]后面都是比他矮的了,插到前面也不会造成影响。
并且很容易想到,对于身高相同的人,k小的人应该优先排序。
代码

def reconstructQueue(people: List[List[int]]) -> List[List[int]]:
    res = sorted(people, key=lambda x: [-x[0], x[1]])
    for i, e in enumerate(res):
        if e[1] < i:
            res.insert(e[1], res.pop(i))
    return res

sorted函数接受参数key来作为排序的依据。
如果不填写key的话,默认升序,在二维数组中,会优先排序第一列,如果第一列相同的话还会按照第二列升序来排。

sorted([[7, 0], [4, 4], [7, 1], [5, 3], [6, 1], [5, 2]])
[[4, 4], [5, 2], [5, 3], [6, 1], [7, 0], [7, 1]]

我们需要的是第一列降序,第二列升序,所以这里直接对第一列取负值来排就可以了。
排好后,k值就是它在当前循环下数组中的位置。
因为他前面都是比他高的人,而k就是代表的比他高的人数。调整他的位置就可以了。

相关文章

  • 根据身高重建队列

    假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面...

  • 根据身高重建队列

    题目描述:假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在...

  • '仰望视野'解leetcode406 2020-11-17(未允

    leetcode406. 根据身高重建队列[https://leetcode-cn.com/problems/qu...

  • TOP 86 - 91

    406. 根据身高重建队列[https://leetcode-cn.com/problems/queue-reco...

  • 406. 根据身高重建队列

    这道题我读了好久才明白是什么意思,是因为忽略了这句话——k是排在这个人前面且身高大于或等于h的人数。看到了这句话才...

  • leetcode 406 根据身高重建队列

    贪心,这题挺难想思路的,卡了差不多一个小时看的答案。 首先维护前面人每一个元素都比后面高!!!根据身高由高到低和名...

  • 贪心十五:根据身高重建队列

    题目地址: https://leetcode-cn.com/problems/queue-reconstruct...

  • 406. 根据身高重建队列

    假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面...

  • 406. 根据身高重建队列

    假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面...

  • 406.根据身高重建队列

    解法 主要练习下比较器的使用,以及二维数组插入的处理

网友评论

      本文标题:根据身高重建队列

      本文链接:https://www.haomeiwen.com/subject/sdasfctx.html