---
# System prepended metadata

title: 406. Queue Reconstruction by Height
tags: [Leetcode, greedy, medium, python, c++, sort]

---

###### tags: `Leetcode` `medium` `greedy` `sort` `python` `c++`

# 406. Queue Reconstruction by Height

## [題目連結:] https://leetcode.com/problems/queue-reconstruction-by-height/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]]
```

## 解題想法:
* 此題為給一數組people:
	* people[i]=[hi,ki]
	* hi: 身高
	* ki: 由左到右有多少人高於自己
	* 將數組排序好
* Greedy+Sort
	* **Step1**:
		* 先按照hi由大排到小
	* **Step2**:
		* 再由ki小到大: 處理對於相同hi之ki問題
	* **Step3**:
		* 最後將每人依照**ki**插入對應位置

## Python:
* 排序使用好工具lambda
``` python=
class Solution(object):
    def reconstructQueue(self, people):
        """
        :type people: List[List[int]]
        :rtype: List[List[int]]
        """
        people.sort(key=lambda x: (-x[0],x[1])) 
        #-x[0]表示看hi由大到小 x[1]表示看ki由小到大
        res=[]
        for p in people:
            res.insert(p[1],p) #list.insert(index,obj)
        return res
    
people = [[7,0],[4,4],[7,1],[5,0],[6,1],[5,2]]
result=Solution()
ans=result.reconstructQueue(people)
print(ans)
```

## C++:
* c++ sort排序技巧可參考 https://shengyu7697.github.io/std-sort/
``` cpp=
class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        //sort vector use lambda function
        sort(people.begin(), people.end(), [](vector<int>& x, vector<int>& y){
            // 0: hi, 1: ki
            return x[0]>y[0] || (x[0]==y[0] && x[1]<y[1]);
        });
        vector<vector<int>> res;
        for (auto& val: people){
            res.insert(res.begin()+val[1],val);
        }
        return res;
    }
};
```