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
网友评论