###### 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;
}
};
```