【LeetCode】70. Climbing Stairs

来源:互联网 发布:车载gps数据库后台安装 编辑:程序博客网 时间:2024/04/28 06:27

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


0 0