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]]
按高度降序排序,若高度相同按.second升序排序,然后放到list中在进行插入
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
sort(people.begin(), people.end(), cmp);
list<pair<int, int>> order;
order.assign(people.begin(), people.end());
auto it = order.begin();
while (it != order.end()) {
auto head = order.begin();
int cnt = 0;
while (cnt < it->second) {
++head, ++cnt;
}
if (head != it) {
pair<int, int> node = *it;
it = order.erase(it);
order.insert(head, node);
}
else
++it;
}
people.assign(order.begin(), order.end());
return people;
}
static bool cmp(pair<int, int> a, pair<int, int> b) {
if (a.first == b.first)
return a.second < b.second;
return a.first > b.first;
}
};