forked from ely-mitu/leetcode
-
Notifications
You must be signed in to change notification settings - Fork 0
/
QueueReconstructionByHeight.cpp
73 lines (67 loc) · 3.09 KB
/
QueueReconstructionByHeight.cpp
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
// Source : https://leetcode.com/problems/queue-reconstruction-by-height/
// Author : Hao Chen
// Date : 2016-11-12
/***************************************************************************************
*
* 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
*
* 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]]
***************************************************************************************/
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
//sort function
auto comp = [](const pair<int, int>& p1, const pair<int, int>& p2)
{ return p1.first == p2.first ? p1.second < p2.second : p1.first > p2.first; };
//sort the people with their height with descending order
// and if the height is same then sort by K with ascending order
sort(people.begin(), people.end(), comp);
// For example:
// Original Queue: [7,0], [4,4], [7,1], [5,0], [6,1], [5,2]
// Sorted Queue: [7,0], [7,1], [6,1], [5,0], [5,2], [4,4]
// Why do we need to sort like this?
//
// ** The position of shorter people is ZERO impacted with higher people. **
//
// and, the shortest people has no impacts to all of people. we can simpley insert it to the Kth position
//
// So, we sorted the people from highest to the shortest, then when we insert the people to another array,
//
// we always can guarantee the people is going to be inserted has nothing to do with the people has been inserted.
//
// Let's continue the about example above
//
// [7,0] => [] then [7,0]
// [7,1] => [7,0] then [7,0], [7,1]
// [6,1] => [7,0], [7,1] then [7,0], [6,1], [7,1]
// [5,0] => [7,0], [6,1], [7,1] then [5,0], [7,0], [6,1], [7,1]
// [5,2] => [5,0], [7,0], [6,1], [7,1] then [5,0], [7,0], [5,2], [6,1], [7,1]
// [4,4] => [5,0], [7,0], [5,2], [6,1], [7,1] then [5,0], [7,0], [5,2], [6,1], [4,4], [7,1]
//
// We alway can see, the people is going to be inserted has NO IMPACT with the current people.
//
// [6,1] => [7,0], [7,1]
//
// Whatever the people[6,1] placed, it has nothing to do with the people [7,0] [7,1],
// So, we can just insert the people to the place he like - the `Kth` place.
//
//
vector<pair<int, int>> res;
for (auto& p : people) {
res.insert(res.begin() + p.second, p);
}
return res;
}
};