LeetCode #406 根据身高重建队列
题目描述
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对 (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]]
思路分析:贪心
可以想到用插入比较好解决,就是前面的 “顺序序列“ 怎么构造的问题
- 如果身高较小的先做插入的话,那当出现需要身高高的插入的话可能出现原先正确插入的第 k 个位置变成了 k+1,顾此失彼
- 身高较高的先做插入,那显然是身高用降序,个数用升序,这时可以用数组的下标来表示前面有多少个人来巧妙的插入
可以看图来理解这个问题 根据身高重建队列
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
if not people: return []
people.sort(key = lambda x: (-x[0], x[1]))
res = []
for i in people:
res.insert(i[1], i)
return res
- 时间复杂度: O ( N 2 ) O(N^2) O(N2):排序用了 O ( N l o g N ) O(NlogN) O(NlogN) 的时间,每个人插入队列需要 O ( k ) O(k) O(k) 的时间,其中 k k k 是当前输出队列的元素个数。总共的时间复杂度为 O ( ∑ k = 0 N − 1 k ) = O ( N 2 ) O(\sum\limits_{k=0}^{N-1}k)=O(N^2) O(k=0∑N−1k)=O(N2)
- 空间复杂度: O ( N ) O(N) O(N):输出队列使用的空间