406. Queue Reconstruction by Height

目录

题目描述

贪心+直接插入排序

代码一:

代码二:

代码三:


题目描述

406. Queue Reconstruction by Height

贪心+直接插入排序

先按照身高从大到小排序,身高相等的人谁的k小谁站前面。

然后按照直接插入排序的想法,将每个人插入到他应该到达的位置。

代码一:

复用输入数据people,手写直接插入排序

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        int len = people.size();
        sort(people.begin(),people.end(),[](vector<int> &p1,vector<int> &p2){
            if(p1[0] > p2[0])
                return true;
            else if(p1[0] == p2[0])
                return p1[1] < p2[1];
            return false;
        });
        for(int i = 0;i <len;i++){
            if(people[i][1] < i){
                vector<int> temp = people[i];
                int pos = people[i][1];
                for(int j = i-1;j >= pos;j--){
                    people[j+1] = people[j];
                }
                people[pos] = temp;
            }
        }
        return people;
    }
};

插入会很耗时,时间复杂度是O(logn+n^2)

代码二:

用vector自己的insert函数,位置指定用迭代器。随机迭代器支持+n操作

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        int len = people.size();
        sort(people.begin(),people.end(),[](vector<int> &p1,vector<int> &p2){
            if(p1[0] > p2[0])
                return true;
            else if(p1[0] == p2[0])
                return p1[1] < p2[1];
            return false;
        });
        vector<vector<int>> res;
        res.reserve(len);
        for(int i = 0;i <len;i++){
            int pos = people[i][1];
            if(pos < i){
                res.insert(res.begin()+pos,people[i]);
            }else{
                res.push_back(people[i]);
            }
        }
        return res;
    }
};

代码三:

用链表来插入。不过寻找插入位置仍然是O(n)的时间复杂度,因为在 C++ 中,std::list 的迭代器是双向迭代器,不支持随机访问(即不能直接使用 + 运算符进行偏移)

class Solution {
public:
    vector<vector<int>> reconstructQueue(vector<vector<int>>& people) {
        int len = people.size();
        sort(people.begin(),people.end(),[](vector<int> &p1,vector<int> &p2){
            if(p1[0] > p2[0])
                return true;
            else if(p1[0] == p2[0])
                return p1[1] < p2[1];
            return false;
        });
        std::list<vector<int>> listres;
        for(int i = 0;i <len;i++){
            if(people[i][1] < i){
                int pos = people[i][1];
                listres.insert(std::next(listres.begin(),pos),people[i]);
            }
            else
                listres.push_back(people[i]);
        }
        vector<vector<int>> res(listres.begin(),listres.end());
        return res;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值