假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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]]
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/queue-reconstruction-by-height
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
因为考虑到身高大于等于h的,要在前方有k个,那么换句话说
当考虑一个身高为h的人,不用考虑身高小于h的所有人
维护答案队列,使得插入身高为h的人时,队列里面的身高都大于等于h(高的先插入)
因为队列里的都高,所以可以把k
作为队列的插入下标,保证正确性
注意
除了插入顺序是从高到矮,还要保证同一身高,k小的先插入,因为同一身高,k小的会在k大的前面,比如 a=[7, 2],b=[7,1]
,先插入a的话,因为b必定在a前面,那么a的下标其实是不对的,但是如果反过来,先插入b,因为b在a的前面,再按照k值插入队列,能够保证a插入正确
扫描二维码关注公众号,回复:
10088733 查看本文章
代码
class Solution {
public:
static bool cmp(vector<int>& p1, vector<int>& p2)
{
if(p1[0]==p2[0]) return p1[1]<p2[1];
return p1[0]>p2[0];
}
vector<vector<int>> reconstructQueue(vector<vector<int>>& people)
{
vector<vector<int>> ans;
sort(people.begin(), people.end(), cmp);
for(int i=0; i<people.size(); i++)
ans.insert(ans.begin()+people[i][1], people[i]);
return ans;
}
};