学习算法题Day1——剑指offer

第9题

题目:用两个栈实现一个队列。队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能。(若队列中没有元素,deleteHead 操作返回 -1 )

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/yong-liang-ge-zhan-shi-xian-dui-lie-lcof
在这里插入图片描述
在这里插入图片描述

思路:

1、题目一开始就没有读懂。题目解析如下
在这里插入图片描述
在这里插入图片描述
2、官方思路:
在这里插入图片描述

解答:
class CQueue {
    stack<int> stack1,stack2;
public:
    CQueue() {//建立两个空栈
       while(!stack1.empty()){
           stack1.pop();
       }
       while(!stack2.empty()){
           stack1.pop();
       }

    }
    
    void appendTail(int value) {
        stack1.push(value);

    }
    
    int deleteHead() {
        if(stack2.empty()){
            while(!stack1.empty()){
                stack2.push(stack1.top());
                stack1.pop();
            }
        }
        if(stack2.empty()){
            return -1;
        }else{
            int x=stack2.top();
            stack2.pop();
            return x;
        }

    }
};
反思

1、题读不懂
2、平台使用不熟练
3、堆栈和队列不熟练,基本操作和书有出入,要多练习

第10题 斐波那契数列

题目:

在这里插入图片描述
在这里插入图片描述

我的错误答案:
class Solution {
public:
    int fib(int n) {
        if(n==0){
            return 0;
        }
        else if(n==1){
            return 1;
        }
        else{
            return fib(n-1)+fib(n-2);
        }

        

    }
};

超时了
在这里插入图片描述

答案:
class Solution {
public:
    int fib(int n) {
        int a=1000000007;//题目要求取模
        int i;
        int p=0,q=0,r=1;
        if(n==0){
            return 0;
        }
        else if(n==1){
            return 1;
        }
       for(i=2;i<=n;i++){//动态规划法
             p=q;
             q=r;      //q向后挪一位
             r=(p+q)%a;//r向后挪一位
       }

        return r;

    }
};
解析:

在这里插入图片描述

反思:注意时间复杂度,不能超时。递归法容易超时。

第10题 练习

在这里插入图片描述

class Solution {
public:
    int numWays(int n) {
        int mod=1000000007;
        int p=1,q=1,r=1;
        if(n==0||n==1){
            return 1;
        }
        else{
            for(int i=2;i<=n;i++){
                p=q;
                q=r;
                r=(p+q)%mod;
            }
        }
        return r;


    }
};

第30题包含min的函数的栈

在这里插入图片描述

答案:
class MinStack {
    stack<int> A,B;
public:
    /** initialize your data structure here. */
    MinStack() {
    }
    
    void push(int x) { 
        A.push(x);
        if(B.empty()||B.top()>=x)B.push(x);
    }
    
    void pop() {
        if(A.top()==B.top())B.pop();
        A.pop();

    }
    
    int top() {
        return (A.top());
    }
    
    int min() {
        return (B.top());
         }

};

思路:

在这里插入图片描述
在这里插入图片描述

反思:算法题非常注重时间复杂度,一定要多思考多留心。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值