Suppose you have a random list of people standing in a queue. Each person is described by a pair of integers (h, k)
, where h
is the height of the person and k
is the number of people in front of this person who have a height greater than or equal to h
. Write an algorithm to reconstruct the queue.
Note:
The number of people is less than 1,100.
Example
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]]
思路:想法一自己最开始的想法是,第一个元素肯定是[?,0],所以先把第二个元素为0的元素找出来,然后遍历挨个计数,看看与其第二个数型不相符合,这种想法操作过于麻烦。。。。
想法二:排序,按照第一个元素降序排序,第一个元素相同按照第二个元素升序排序,依次查询每个元素前面数的个数,相符不动,不相符移动。思路还是差那么一丢丢
终极想法:网友的思路,按第一个元素降序,第二个元素升序,然后把每个元素插入到新的数组的对应位置。好厉害!!!
class Solution(object):
def reconstructQueue(self, people):
"""
:type people: List[List[int]]
:rtype: List[List[int]]
"""
if people is None or people == []:
return people
for i in range(len(people)):
for j in range((i+1),len(people)):
if people[i][0] == people[j][0]:
if people[i][1]>people[j][1]:
people[i],people[j]=people[j],people[i]
elif people[i][0]<people[j][0]:
people[i],people[j]=people[j],people[i]
lis = []
for i in range(len(people)):
lis.insert(people[i][1],people[i])
return lis
代码运行时间太长,,,下面是大神的解答,思路都是那个思路,就i是别人用简洁的代码写出来了,学下:
惊奇于lambda p:(-p[0], p[1])
class Solution:
def reconstructQueue(self, people):
"""
:type people: List[List[int]]
:rtype: List[List[int]]
"""
ret = []
for p in sorted(people, key=lambda p: (-p[0], p[1])):
ret.insert(p[1], p)
return ret