题目大意
假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
解题思路
题目要求排在当前这个人前面,身高大于等于当前身高的人的数量等于k,因此我们考虑从高个子向矮个子进行排序,res表示当前拍好的序列。
即,首先考虑身高最高的人[7,0]和[7,1]。根据题目要求,身高为7的人有两人,顺序是[[7,0], [7,1]]。
再考虑身高为6的人[6,1],res中的身高都要大于6.想要当前这个人前面只有一个人的身高大于等于6,那么直接将[6,1]插入res中的1位置即可,这样前面只有1个比它大的,而且res后面的序列不会发生改变(因为当前res中都是身高大于6的,所以不影响)。
class Solution {
private:
// 对数组排序,首先按照身高降序,然后按照要求人数升序
// 在身高相同情况下,如果先插入k较大的,则当较小k对应的元素插入时,较大k对应的元素将会不满足条件
static bool cmp(const vector<int> & x, const vector<int> & y){
if (x[0] != y[0]){
return x[0] > y[0];
}
else{
return x[1] < y[1];
}
}
public:
vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
if (people.empty())
return {};
// 对数组排序
sort(people.begin(), people.end(), cmp);
vector<vector<int>> res;
// 依次插入到相应位置
for (int i = 0; i < people.size(); ++i){
res.insert(res.begin() + people[i][1], people[i]);
}
return res;
}
};