LeetCode 刷题: Climbing Stairs --- 类似于Fibonacci 数列

You are climbing a stair case. It takes n steps to reach to the top.

Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?

这道题目类似于Fibonacci 数列。

解法有两种,一种是递归,一种是非递归:

非递归:

class Solution {
public:
    int climbStairs(int n) {
        if(n<=2)
            return n;
        
        int n1 = 1;
        int n2 = 2;
        int temp =3;
        int t;
        while(temp<=n)
        {
            t = n1 + n2;
            n1 = n2;
            n2 = t;
            temp++;
        }
        return n2;
    }
};

递归:

递归效率较低,我的一个递归算法没有被LeetCode 系统接受,理由是当n很大的时候,递归太多。

改进的方法是: 将每一个运算的结果记录下来,这样下一次计算的时候,如果已经算出值的,就不用再算一遍了

改进算法:

class Solution {
    unordered_map<int, int> res = {{1,1},{2,2},{3,3}};    //必须放在climbStairs 外面,全局变量
public:
    int climbStairs(int n) {
        if(res.find(n) == res.end())
        {
            res[n] = climbStairs(n-1) + climbStairs(n-2);
        }
        return res[n];
    }
};







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值