406-queue-reconstruction-by-height¶
Try it on leetcode
Description¶
You are given an array of people, people
, which are the attributes of some people in a queue (not necessarily in order). Each people[i] = [hi, ki]
represents the ith
person of height hi
with exactly ki
other people in front who have a height greater than or equal to hi
.
Reconstruct and return the queue that is represented by the input array people
. The returned queue should be formatted as an array queue
, where queue[j] = [hj, kj]
is the attributes of the jth
person in the queue (queue[0]
is the person at the front of the queue).
Example 1:
Input: people = [[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]] Explanation: Person 0 has height 5 with no other people taller or the same height in front. Person 1 has height 7 with no other people taller or the same height in front. Person 2 has height 5 with two persons taller or the same height in front, which is person 0 and 1. Person 3 has height 6 with one person taller or the same height in front, which is person 1. Person 4 has height 4 with four people taller or the same height in front, which are people 0, 1, 2, and 3. Person 5 has height 7 with one person taller or the same height in front, which is person 1. Hence [[5,0],[7,0],[5,2],[6,1],[4,4],[7,1]] is the reconstructed queue.
Example 2:
Input: people = [[6,0],[5,0],[4,0],[3,2],[2,2],[1,4]] Output: [[4,0],[5,0],[2,2],[3,2],[1,4],[6,0]]
Constraints:
1 <= people.length <= 2000
0 <= hi <= 106
0 <= ki < people.length
- It is guaranteed that the queue can be reconstructed.
Solution(Python)¶
class Node:
def __init__(self, p):
self.person = p
self.count = 1
self.left = None
self.right = None
class Solution:
def reconstructQueue(self, people: List[List[int]]) -> List[List[int]]:
ln = len(people)
if ln == 0:
return []
people = sorted(people, key=lambda x: (-x[0], x[1]))
root = Node(people[0])
for p in people[1:]:
self.insert(root, p, p[1])
res = []
self.inorder(root, res)
return res
def insert(self, root, p, count):
# insert to the left
if root.count > count:
if not root.left:
root.left = Node(p)
else:
self.insert(root.left, p, count)
# because I have now one more node on the left
root.count += 1
else:
if not root.right:
root.right = Node(p)
else:
# I already have count - root.count nodes on the left
self.insert(root.right, p, count - root.count)
def inorder(self, root, res):
if root:
self.inorder(root.left, res)
res.append(root.person)
self.inorder(root.right, res)