Table of Contents
Problem Description of Queue Reconstruction by Height
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 has a height greater than or equal to h. Write an algorithm to reconstruct the queue.
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]]
Algorithm For Queue Reconstruction by Height
- Declare a vector “ans” of n rows and 2 columns where n is the number of people.
- Initialize a Boolean vector “check” of size n with all values initially set to false, where check[i] represents whether we have filled the ith position or not.
- Sort the given array in a non-decreasing manner and if the height of two people is the same then the one with the smaller K comes first.
- Run a loop on i from 0 to n
- Initialize a “count” variable which counts the number of people with the same or greater height than the height of our current element.
- Run a loop on j from 0 to n
- If the current element is not filled yet or have the same height as height[i] then increment
- If the value of count gets more than the K of the current element, then break from this loop.
- Update the value of ans[j]=people[i].
- Update the value of check[j]=true because the jth position is occupied now.
- Return “ans”.
Implementation for Queue Reconstruction by Height
C++ program for Queue Reconstruction by Height
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>> reconstructQueue(vector<vector<int>> &people)
{
int n = people.size();
vector<vector<int>> ans(n);
vector<bool> check(n, false);
sort(people.begin(), people.end());
for (int i = 0; i < n; i++)
{
int count = 0;
int j = 0;
while (count < people[i][1])
{
if ((!check[j]) or (ans[j][0] == people[i][0]))
{
count++;
}
j++;
}
while (check[j])
{
j++;
}
ans[j] = people[i];
check[j] = true;
}
return ans;
}
int main()
{
vector<vector<int>> people = {{7, 0}, {4, 4}, {7, 1}, {5, 0}, {6, 1}, {5, 2}};
vector<vector<int>> ans = reconstructQueue(people);
for (int i = 0; i < ans.size(); i++)
{
for (int j = 0; j < ans[i].size(); j++)
{
cout << ans[i][j] << " ";
}
cout << endl;
}
return 0;
}
5 0 7 0 5 2 6 1 4 4 7 1
JAVA program for Queue Reconstruction by Height
import java.util.*;
public class Main
{
public static int[][] reconstructQueue(int[][] people)
{
int n = people.length;
int[][] ans=new int[n][2];
boolean[] check=new boolean[n];
for(int i=0;i<n;i++)
{
check[i]=false;
}
Arrays.sort(people, new Comparator<int[]>() {
public int compare(int[] a, int[] b) {
if (a[0] != b[0]) {
return (a[0] - b[0]);
} else {
return (a[1] - b[1]);
}
}
});
for (int i = 0; i < n; i++)
{
int count = 0;
int j = 0;
while (count < people[i][1])
{
if ((check[j]==false) || (ans[j][0] == people[i][0]))
{
count++;
}
j++;
}
while (check[j])
{
j++;
}
ans[j][0] = people[i][0];
ans[j][1] = people[i][1];
check[j] = true;
}
return ans;
}
public static void main(String[] args) {
int[][] people={{10, 0}, {2, 0}, {2, 4}, {8, 1}, {2, 2}, {10, 1}};
int[][] ans=reconstructQueue(people);
for (int i = 0; i < ans.length; i++)
{
for (int j = 0; j < ans[i].length; j++)
{
System.out.print(ans[i][j]+" ");
}
System.out.println();
}
}
}
2 0 10 0 2 2 8 1 2 4 10 1
Complexity
Time complexity
For every person, it takes O(n) time to find its position so total time complexity is O(n^2).
Space complexity
We took a “check” array and the “ans” array both with size n so space complexity is O(n).