https://leetcode.com/problems/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)
, whereh
is the height of the person andk
is the number of people in front of this person who have a height greater than or equal toh
. 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]]
很直接的思路就是每个后缀为零的数的排列必然是升序的,但是如果按这种想法之后一个个插入的话,就涉及到判断原本久违的vector和新vector的高度关系。
所以要保持一个单调性:要么已就绪的vec的高度均小于当前高度,要么以就绪的vec的高度均大于当前高度
前者情况下,所有就绪vec对当前vec的编号无贡献,当前vec的编号必然来源于其之后的插入,所以预留位置
后者情况下,当前vec编号仅受就绪vec数量影响,因此直接插入到正确位置
前者:
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), [](const vector<int>& p1, const vector<int>& p2) -> bool {
return p1[0]==p2[0] ? p1[1] > p2[1] : p1[0] < p2[0];
});
vector<vector<int>> result(people.size());
vector<int> indice(people.size());
iota(indice.begin(), indice.end(), 0);
for(auto cur : people){
result[indice[cur[1]]] = cur;
indice.erase(indice.begin()+cur[1]);
}
return result;
}
};
后者:
class Solution {
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), [](const vector<int>& p1, const vector<int>& p2) -> bool {
return p1[0]==p2[0] ? p1[1] < p2[1] : p1[0] > p2[0];
});
vector<vector<int>> result;
for(auto cur : people){
result.insert(result.begin()+cur[1], cur);
}
return result;
}
};