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

2020-11-17  本文已影响0人  9_SooHyun

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
上一篇 下一篇

猜你喜欢

热点阅读