【LeetCode】70. Climbing Stairs

70. Climbing Stairs

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?

【分析】

   题意:爬一个有n级阶梯的楼梯,每一步只能上一级或者两级,问一共有多少种不同爬楼方式。

   这个题很简单,本质上就是一个“斐波拉契数列”,我们欲到达第n级台阶,上一步需要到达第n-1级或者n-2级,那么达到第n级的方式总数就等于到达第n-1级和第n-2级方式的和:F(n)=F(n-1)+F(n-2),n>2;F(1)=1;F(2)=2;很明显,这就是斐波拉契数列。

   对于斐波拉契数列的求解,教科书上一般采用的是“递归”求解,程序虽然简洁,但是效率并不高,并且当n比较大时,递归方式用到的“”存储结构可能溢出。效率不高的原因在于重复计算过多,比如欲求F(n)=F(n-1)+F(n-2),需递归求F(n-1)=F(n-2)+F(n-3)和F(n-2)=F(n-3)+F(n-4),明显,F(n-2)、F(n-3)被重复求解,依次递推,会出现大量的重复求解部分,极大的降低了效率。因此,我们可对此算法进行改进,采用顺序求解方式:即,从自底向上求解,F(1),F(2),F(3),F(4),...,F(n),如是,便不会出现重复求解的部分。

【解法及注释】

方法一:“递归”求解(会超时)

class Solution {
public:
    int climbStairs(int n) {
        
       int F1=1;
       int F2=2;
       
       if(n<=0)return 0;
       else if(n==1)return 1;
       else if(n==2)return 2;
       else if(n>2)
       {
         return climbStairs(n-1)+climbStairs(n-2);
       }
    }
};


方法二:“顺序”求解

class Solution {
public:
    int climbStairs(int n) {
        
       int F1=1;
       int F2=2;
       int Fn=0;
       if(n<=0)return 0;
       else if(n==1)return 1;
       else if(n==2)return 2;
       else if(n>2)
       {
           for(int i=3;i<=n;i++)
           {
               Fn=F1+F2;
               F1=F2;
               F2=Fn;
           }
       }
       return Fn;    
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jin_Kwok

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值