假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(h, k)表示,其中h是这个人的身高,k是排在这个人前面且身高大于或等于h的人数。 编写一个算法来重建这个队列。
注意:
- 总人数少于1100人。
示例
输入:
[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]]
输出:
[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]]
一、思路
先看看相同高度h的情况下的排序规则:按照k的大小进行排序。
k的定义:k是排在这个人前面且身高大于或等于h的人数。也就是说在高度为h的人前后插入高度低于h的人,不影响高度为h的人的k的正确性
举个例子:
在下面这个队列中,插入小于7的人,只要他的插入顺序正确,不会改变队列的正确性
[7, 0], [7, 1]
[6, 1]插入位置1:
[7, 0], [6, 1], [7, 1]
[5, 0]插入位置0:
[5, 0], [7, 0], [6, 1], [7, 1]
[5, 2]插入位置2:
[5, 0], [7, 0], [5, 2], [6, 1], [7, 1]
[4, 4]插入位置4:
[5, 0], [7, 0], [5, 2], [6, 1], [4, 4], [7, 1]
所以在重构队列的时候,首先要将最高的人的安置好,从高到低插入新的人,插入的位置取决于人的k。
代码:
class Solution {
public:
static bool cmp(vector<int> p1, vector<int> p2) {
if (p1[0] > p2[0]) {
return true;
}
else if (p1[0] == p2[0]) {
return p1[1] < p2[1];
}
else {
return false;
}
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
sort(people.begin(), people.end(), cmp);
vector<vector<int>> ans;
for (auto p : people) {
ans.insert(ans.begin() + p[1], p);
}
return ans;
}
};