思路
这道题用贪心来解决。
本题的核心:矮个子的人对高个子来说,是“**看不见的”**。
了解了这一点,我们就可以由易到难来分析这个题。
- 如果所有人的个子都一样高,那应该怎么排序呢?很简单,按照下标值排序就行了。换言之,把
[x, i]
这位同学,放到i位置就可以了。 - 现在个子不一样高,那应该怎么排序呢?我们别忘了,矮个子对高个子来说,是“看不见”的。比如,对
[7, 0], [7, 1]
来说,现在插入一个身高为6的同学,这位同学插入哪个位置,对身高为7的两位同学来说,都无所谓,因为身高为7的两位同学的**相对位置**不受矮个子的影响。 - 了解了这些,思路就明确了。我们可以按身高,先排个子最高的那些人,再排次高的那些人,以此类推。排序方法就是把
[x, i]
这位同学放到i
这个位置。比如说[7, 0], [7, 1]
已经排好,现在要拍[6, 1]
,那么直接把该同学放到1
号下标处即可,变为[7, 0], [6, 1], [7, 1]
。这样可行是因为身高为7的两位同学的先后顺序(相对位置)不受身高为6的同学的影响。python代码
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
# 这里的含义是先按列表中第一个元素的负值执行排序,拍好后再按照第二个元素进行排序
# 因为默认是按照key进行升序排序,所以此代码含义就是先按第一个元素进行降序排序,再按第二个元素进行升序排序
people.sort(key=lambda x: (-x[0], x[1]))
rel = []
for p in people:
rel.insert(p[1], p)
return rel
时空复杂度
时间复杂度O(N)
排序时间复杂度O(NlogN),而每次插入时间复杂度O(K),共N个元素进行插入,所以总插入时间复杂度O(N)空间复杂度O(N)
输出列表所需空间