第六天 用两个栈实现队列+双栈排序+猫狗收容所

最近由于写论文的原因,刷题的频率相对下降。为了节约时间,一般题目只有自己代码,不满意的题目会贴别人优秀代码。

用两个栈实现队列和双栈排序想法大致相同,有点像插入排序,每次通过在两个栈之间相互传输保证相对顺序,并在适当地方插入新值。

第一题

class Solution
{
public:
    void push(int node) 
    {
        if (stack1.empty())
            stack1.push(node);
        else
        {
            while (!stack1.empty())
            {
                stack2.push(stack1.top()) ;
                stack1.pop();
            }
            stack1.push(node);
            while (!stack2.empty())
            {
                stack1.push(stack2.top()) ;
                stack2.pop();
            }
        }
        
    }

    int pop() 
    {
        int x = stack1.top();
        stack1.pop();
        return x;
    }

private:
    stack<int> stack1;
    stack<int> stack2;
};

第二题

class TwoStacks {
public:
    vector<int> twoStacksSort(vector<int> numbers) {
        // write code here
        if (numbers.empty()) return numbers;
        vector<int> result;
        while (!numbers.empty())
        {   
            int temp = numbers.front();
            numbers.erase(numbers.begin());
            if (result.empty())
                result.insert(result.begin(), temp);
            else
            {
                int num = 0;
                while (!result.empty() && result.front() > temp)
                {
                    numbers.insert(numbers.begin(), result.front());
                    result.erase(result.begin());
                    num++;
                }
                result.insert(result.begin(), temp);
                while(num--)
                {
                    result.insert(result.begin(), numbers.front());
                    numbers.erase(numbers.begin());
                }
            }
        }
        return result;
    }
};

猫狗这题思路:1. 两个队列,为了不用依次搜索下去,只要检查队列的头即可(时间复杂度) 2. 把操作索引直接放入队列,来判断先后。

缺点:代码太长了,感觉重复的很多。

吐槽:看了几份别人的代码,都好长...

class CatDogAsylum {
public:
    vector<int> asylum(vector<vector<int> > ope) {
        // write code here
        vector<int> result;
        if(!ope.size()) return result;
        queue<int> cat, dog;
        
        for(int i = 0; i < ope.size(); i++)
        {
            vector<int> temp = ope[i];
            if(temp[0] == 1 && temp[1] > 0)
                dog.push(i);
            if(temp[0] == 1 && temp[1] < 0)
                cat.push(i);
            if(temp[0] == 2 && !temp[1])
            {
                if(cat.empty() && !dog.empty())
                {
                    result.push_back(ope[dog.front()][1]);
                    dog.pop();
                }
                if(!cat.empty() && dog.empty())
                {
                    result.push_back(ope[cat.front()][1]);
                    cat.pop();
                }
                if(!cat.empty() && !dog.empty())
                {
                    if(cat.front() > dog.front())
                    {
                        result.push_back(ope[dog.front()][1]);
                        dog.pop();
                    }
                    else
                    {
                        result.push_back(ope[cat.front()][1]);
                        cat.pop();
                    }
                }
            }
            if(temp[0] == 2 && temp[1] == 1)
            {
                if(!dog.empty())
                {
                    result.push_back(ope[dog.front()][1]);
                    dog.pop();
                }
            }
            if(temp[0] == 2 && temp[1] == -1)
            {
                if(!cat.empty())
                {
                    result.push_back(ope[cat.front()][1]);
                    cat.pop();
                }
            }            
        }
        return result;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值