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

1
2
3
4
5
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]]

思路

Based on the thought of
https://discuss.leetcode.com/topic/60394/easy-concept-with-python-c-java-solution

  1. Pick out tallest group of people and sort them in a subarray (S). Since there’s no other groups of people taller than them, therefore each guy’s index will be just as same as his k value.

  2. For 2nd tallest group (and the rest), insert each one of them into (S) by k value. So on and so forth.

E.g.

1
2
3
input: [[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
subarray after step 1: [[7,0], [7,1]]
subarray after step 2: [[7,0], [6,1], [7,1]]

However meet a lot of problems during realization of the code.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
class Solution(object):
def reconstructQueue(self, people):
"""
:type people: List[List[int]]
:rtype: List[List[int]]
"""
stats = {}
for person in people:
if (stats.has_key(person[0])):
stats[person[0]] += 1
else:
stats[person[0]] = 1
if (people):
people.sort(reverse = True)
print people
result = []
for person in people:
count = stats[person[0]]
if (not result):
result.append(person)
else:
if (person[1]-count+1 >= len(result)):
result.append(person)
else:
#There is a gap between the right answer and the direct insert method
#The insert index should add a bias of (-count+1) to fill that gap
result.insert(person[1]-count+1, person)
stats[person[0]] -= 1
return result
else:
return []