这是问题陈述
假设您有一个随机排队的人名单。每个人都用一对整数(h,k)描述,其中h是人的身高,k是在此人面前的身高大于或等于h的人数。编写算法以重建队列。
注意: 人数不到1100。
示例:
Input:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
Output:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]`
我已经解决了这一问题,方法是先按高度排序,然后按位置排序,以便示例中的输入变为
[[4,4], [5,0], [5,2], [6,1], [7,0], [7,1]]
我还有一个可用索引列表和一个空数组
[0, 1, 2, 3, 4, 5]
,[-, -, -, -, -, -]
我遍历排序后的数组,并使用k
选择kth
可用索引。所以我们的第一个迭代是[4,4]
,我们有了所有可用的索引,我将从可用索引中弹出第4个索引,并将[4,4]
元组放在第4个索引中的新数组中。我的可用索引和新数组现在已经出现
[0, 1, 2, 3, 5]
,[-, -, -, -, [4,4], -]
下一个迭代是[5,0]
。我从可用的索引0th
中弹出0
索引,并将[5,0]
放在新数组的0th
索引中。
[1, 2, 3, 5]
,[[5,0], -, -, -, [4,4], -]
第三次迭代是[5,2]
,这与问题陈述中提到的k
是指相同或更高身高的人数不同,因此我将偏移量变量和先前的高度变量保留为跟踪有多少人领先于此人。如果当前人的身高与最后一个人的身高相同,我将弹出k-1th
可用索引并将偏移量增加。如果下一个人的身高与前一个人的身高相同,我将弹出k-2th
可用索引。当看到新的高度时,将重置偏移量。
[1, 3, 5]
,[[5,0], -, [5,2], -, [4,4], -]
以此类推...
我编写的算法如下
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
people.sort(key=lambda p: (p[0], p[1]))
n = len(people)
recon = [0] * n
available_idxs = list(range(n))
previous_height = -1
offset = 0
for h, k in people:
if previous_height == h:
offset += 1
position = available_idxs.pop(k-offset)
else:
offset = 0
position = available_idxs.pop(k)
previous_height = h
recon[position] = [h, k]
return recon
排序的复杂度为O(nlogn)
,而O(n^2)
列表的n
可能会弹出,因此总体上是O(n^2)
。我可以进行哪些更改以优化解决方案?