LeetCode:406 根据身高重建队列 贪心

假设有打乱顺序的一群人站成一个队列。 每个人由一个整数对(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;
    }
};
发布了238 篇原创文章 · 获赞 7 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_44176696/article/details/105041758