这题一开始也属于摸不到头脑那种,但是只要发现其中的关键点,只有比你高的人会影响到你的排位,这个核心点,答案就呼之欲出。
解法一:从高到低
首先将数组从高到低排序,然后从高到低看第二个元素,插后面的元素即可满足条件,代码如下:
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
high_to_low = sorted(people, key=lambda x: (-x[0], x[1]))
result = []
for tup in high_to_low:
result.insert(tup[1], tup)
return result
这里要注意的是,数组的插入是O(N)的,如果用随机链表实现插入,可以使整个算法时间复杂度减少。
然后我仔细想了下,随机链表好像实现不了,还是算了。
解法二:从低到高
这个思路也很巧妙,从小到大排序,最小的元素的位置一定是剩余元素里的位置。因为它是剩余元素中最小的,他前面有的都是比他大的。
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
low_to_high = sorted(people, key=lambda x: (x[0], -x[1]))
result = [None for _ in range(len(people))]
offsets = [i for i in range(len(people))]
for tup in low_to_high:
relative_pos = tup[1]
pos = offsets[relative_pos]
offsets.remove(pos)
result[pos] = tup
return result