In this blog post, we will discuss how to solve the “Queue Reconstruction by Height” problem using a priority queue in C++. This problem involves rearranging a given queue of people based on their heights and the number of people in front of them.
Problem Statement
Given a queue of people represented by pairs of integers (h, k), where h is the height of the person and k represents the number of people in front of them who have a height greater than or equal to h, rearrange the queue such that it is in the correct order.
Approach
To solve this problem, we can use a priority queue as our main data structure. The idea is to sort the people in descending order of their heights and, in case of a tie, sort them in ascending order of their k value.
- First, we sort the people array in descending order of their heights. If two people have the same height, we sort them in ascending order of their
kvalue. - We create an empty priority queue.
- We iterate through the sorted people array, and for each person, we insert them into the priority queue at index
k(as mentioned in the problem statement). The priority queue will automatically reorder itself based on the height andkvalues. - Finally, we convert the priority queue back into a vector and return it as the result.
Example Code
Here’s the C++ implementation of the above approach:
#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>
using namespace std;
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
sort(people.begin(), people.end(), [](pair<int, int>& a, pair<int, int>& b) {
if (a.first == b.first) {
return a.second < b.second;
}
return a.first > b.first;
});
vector<pair<int, int>> result;
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
for (auto& p : people) {
pq.push(p);
}
while (!pq.empty()) {
auto p = pq.top();
pq.pop();
result.insert(result.begin() + p.second, p);
}
return result;
}
int main() {
vector<pair<int, int>> people = {{7, 0}, {4, 4}, {7, 1}, {5, 0}, {6, 1}, {5, 2}};
vector<pair<int, int>> result = reconstructQueue(people);
for (const auto& p: result) {
cout << "(" << p.first << ", " << p.second << ") ";
}
return 0;
}
Conclusion
In this blog post, we discussed how to solve the “Queue Reconstruction by Height” problem using a priority queue in C++. We went through the approach and provided an example implementation. Using a priority queue allows us to efficiently rearrange the queue in the required order.