【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;    
    }
};


你可能感兴趣的:(LeetCode,C++,斐波拉契数列递归求解顺序求解)