美文网首页
'仰望视野'解leetcode406 2020-11-17(未允

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

作者: 9_SooHyun | 来源:发表于2020-11-17 00:41 被阅读0次

    leetcode406. 根据身高重建队列

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

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

    思路:
    每个人只能看到前面不矮于自己的人,即仰望前面的人,比我矮的人与我无关。那么,将大家按身高降序先排好,遍历排序后的降序数组,对于每一个(h, k),将其实时放置在index=k处即可。因为我们总是先将高的排好,矮子后排,而矮子是不会被高个子看到的,那么矮子不管按什么顺序插入都对高的没有影响,只需要关注前面有k个比自己高的就可以,所以要把(h, k)实时放置在index=k处

    一句话,高先矮后,人人仰望——高人按要求排好了,而矮子的插入一定不会影响之前的高人的视野,只影响自己的视野,只需要在k处插入从而保证前方有k个高人就ok

    class Solution:
        def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]: 
    
            # 1.按H降序,k升序排序。如此模拟了【高度单调递减栈】
            # 2.遍历排序好的数组,在k位置插(h,k)
            import copy
            res = copy.deepcopy(people)
            # res -> [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
            res.sort(key=lambda x: (-x[0], x[1]))
            # res -> [[7, 0], [7, 1], [6, 1], [5, 0], [5, 2], [4, 4]]
            for i in range(len(res)):
                ele = res[i]
                index = ele[1]
                if i != index:
                    p = res.pop(i)
                    res.insert(index, p)
            return res
    

    相关文章

      网友评论

          本文标题:'仰望视野'解leetcode406 2020-11-17(未允

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