406 Queue Reconstruction by Height
I find it difficult for me to come up with a general idea about this problem, in another words, my solution can only pass some of the tests.
How to get down to this kind of problem?
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.
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]]
- To use the vector insert, we need to deal with the people with largest height first, then we can insert people with smaller height into them according to the second value. (for example, to insert [4,4], we must have already inserted all people taller than 4, so that we have at least 4 people taller than 4 in the resulting array, then we can insert [4,4] at the right place.)
- For people have the same height, we should deal with the one with smaller second value, which means they should be at the smaller position in the resulting array. (for example, say we have [7,1], [7,0], we should insert [7,0] first, since [7,0] will be counted as the person who has a height greater than or equal to [7,1], so that if we start to deal with [7,1], the [7,0] must has already been inserted.)
class Solution {
public:
vector<pair<int, int>> reconstructQueue(vector<pair<int, int>>& people) {
sort(people.begin(),people.end(), pred());
vector<pair<int, int>> res;
for (auto& p : people)
res.insert(res.begin() + p.second, p);
return res;
}
struct pred{
bool operator()(const pair<int, int> a, const pair<int, int> b){
return a.first>b.first || (a.first==b.first && a.second<b.second);
}
};
};
The key seems to be sorting the original people array correctly, to reach that point, we need to carefully think about what the insert order should be.
And the “INSERT” is definitely a genius approach to solve this problem.