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.

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]]

**Example**

Solution:

<?php class Solution { /** * @param Integer[][] $people * @return Integer[][] */ function reconstructQueue($people) { usort($people, function($p1, $p2){ return ($p1[0] !== $p2[0])? $p2[0] <=> $p1[0] : $p1[1] <=> $p2[1]; }); $result = []; foreach($people as $p){ array_splice($result, $p[1], 0, [$p]); } return $result; } } ?>

[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]

The higher the person is, the more importance it has for other persons

- So starting sort by height, DESC
- Then for each height level, sort by # of higher heads in the front, ASC
- (Just like ‘ORDER BY h DESC, k ASC’ in SQL)

Now we have:

More Important to Others <===> Less Important to Others

[7,0] [7,1] [6,1] [5,0] [5,2] [4,4]

Then set group height = 7 to the result

[7,0] [7,1] ; TBD: [6,1] [5,0] [5,2] [4,4]

Now set group height = 6. It could be places any where, since h=7 can’t see them, so the position is determined by their value of k. for example: [6,1]. there’s one higher/equal height person ahead, we can simply insert it right after k is matched, and push everyone else backwards safely since they don’t care about lower person moving around.

0 1 2 3 4 ..... (index) [7,0] [6, 1] [7,1] ; TBD: [5,0] [5,2] [4,4] [5,0] [7,0] [6, 1] [7,1] ; TBD: [5,2] [4,4] [5,0] [7,0] [5,2] [6, 1] [7,1] ; TBD: [4,4] [5,0] [7,0] [5,2] [6, 1] [4,4] [7,1]

In PHP, `array_splice($result, $p[1], 0, [$p]); `

means insert p to position p[i] and move people behind backwards

In Java, LinkedList seems easier.

In Python, there’s even easier method (list.insert(index, value))