贪心算法+容器list+advance 406. 根据身高重建队列

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]]

解题
先对people进行排序——h从大小,若相等,则k从小到大;
按顺序将people中每个元素插入list容器下标为k的位置;
将list容器转换为int,传出即可;

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
          sort(people.begin(), people.end(),
                [](const vector<int>& lhs, const vector<int>& rhs)
                 {return lhs[0] == rhs[0] ? lhs[1] <= rhs[1] : lhs[0] > rhs[0];});
        //先按h降序,再按k升序
        int n=people.size();
        list<vector<int>> tmp;
        for(int i=0;i<n;i++){
            auto pos=tmp.begin();
            advance(pos,people[i][1]);
            tmp.insert(pos,people[i]);
        }
        return vector<vector<int>> (tmp.begin(),tmp.end());
    }
private:    
    vector<vector<int>> res;
};

list容器:支持insert操作
list.insert(pos,item,插入次数(可省略));

pos为指向要插入位置的迭代器;

注意点——list不能指定下标访问,是类似链表的储存

advace()函数
advance(list容器的迭代器,移动的位置(可正可负));

无返回,直接将传入的迭代器移动 n 个步长;

如题让begin()移动k个位置,即可找到list中下标为k的迭代器,并配合insert插入;

next()函数:只能右移
next(迭代器,步长);
返回传入迭代器移动步长后的迭代器;

prev()函数:只能左移
prev(迭代器,步长);
返回传入迭代器左移步长后的迭代器;

advance()与next()与prev()详细可参考
https://blog.csdn.net/qq_43152052/article/details/102610540

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值