406.根据身高重建队列

  • 406.根据身高重建队列
  • 思路:
    数组vector<vector>people的每一个元素people[i] = [ h[i], k[i] ],h[i]表示他的身高,k[i]表示他前面有几个身高>=他的;
    数组people是打乱顺序的,要根据people的每个人的情况,调整people的元素顺序,恢复出原队列;

1.贪心:
每个人的身高h[i]是确定的,但k[i]只知道他前面有几个身高>=他的,但并不知道具体是哪些人;
要对people调整元素顺序,可依靠的就是h和k,因此设法先确定一个,在去调整另一个;
因此先讲people按h从高到低排序(身高一样高的人k小的在前):因为k[i]不算他前面比他低的,也就是即便往他前面插入一些身高更低的人,也任然符合他的k;
再按k遍历一次调整队列,例如people[i] = [ 4, 2 ],代表这个人前面有两个身高>=他的,因此把他放在下标为2的地方,这样前面确保有people[0]和people[1]一定比他高;并且遍历后面的人时,即便插入到他前面了,因为后面的人身高一定不会高于他,因此即便插入到他前面也无所谓;
即优先按身高高的人的k来插入,插入后的people满足队列属性,遍历完后整个队列满足队列属性;
vector的插入动作太慢,因此选择list,最后在转换为vector即可;

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        sort(people.begin(), people.end(), [](const vector<int>& a, const vector<int>& b){ return a[0] == b[0] ? (a[1] < b[1]) : (a[0] > b[0]); });
        list<vector<int>> Queue;
        for (int i = 0; i < people.size(); ++i) {
            int position = people[i][1];
            auto ite = Queue.begin();
            while (position) {
                ++ite;
                --position;
            }
            Queue.insert(ite, people[i]);
        }
        return vector<vector<int>>(Queue.begin(), Queue.end());
    }
};
  • 总结:
    1.对于多维度问题,选择一个一个解决,并且后面不破坏前面的工作;
    2.根据所需的操作,选择适合的容器
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值