leetcode406. 根据身高重建队列

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

说白了就是恢复原有的队列,根据h和k来判断。

最开始我用的O(n^2)的方法,很难受,超时。

而后看了别人的答案。

首先,按“第h的反序,k的正序”排列这些元素。

也就是排完是[[7,0], [7,1], [6,1], [5,0], [5,2], [4,4]] 。

然后在一个数组中插入p在p[1]的位置。

为什么这个方法是可行的呢?

我们考察一个中间过程。

假设已经有数组[[7,0],[6,1],[7,1]],这很容易判断是符合要求的。

现在p=[5,0]

我要把它插入第0位,因为p【0】肯定是小于等于数组已经存在的a【0】的,因为插入会导致剩下的元素右移,

所以满足了“p【1】相同p【0】小的在前面”(否则队列的k值会不正确)

因此,可以了。

代码如下。

这里面值得注意的是python也可以用java风格的比较器。

class Solution:
    def reconstructQueue(self, people):
        from functools import cmp_to_key
        key = cmp_to_key(lambda x, y: y[0] - x[0] if x[0] != y[0] else x[1] -y[1])#java风格比较器
        people.sort(key=key)
        ans=[]
        for p in people:
            ans.insert(p[1],p)
        return ans

猜你喜欢

转载自blog.csdn.net/weixin_37373020/article/details/81000845