假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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就是代表的比他高的人数。调整他的位置就可以了。
网友评论