【LeetCode】70. Climbing Stairs

柔光的暖阳◎ 2022-07-26 08:35 235阅读 0赞

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),如是,便不会出现重复求解的部分。

【解法及注释】

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

  1. class Solution {
  2. public:
  3. int climbStairs(int n) {
  4. int F1=1;
  5. int F2=2;
  6. if(n<=0)return 0;
  7. else if(n==1)return 1;
  8. else if(n==2)return 2;
  9. else if(n>2)
  10. {
  11. return climbStairs(n-1)+climbStairs(n-2);
  12. }
  13. }
  14. };

方法二:“顺序”求解

  1. class Solution {
  2. public:
  3. int climbStairs(int n) {
  4. int F1=1;
  5. int F2=2;
  6. int Fn=0;
  7. if(n<=0)return 0;
  8. else if(n==1)return 1;
  9. else if(n==2)return 2;
  10. else if(n>2)
  11. {
  12. for(int i=3;i<=n;i++)
  13. {
  14. Fn=F1+F2;
  15. F1=F2;
  16. F2=Fn;
  17. }
  18. }
  19. return Fn;
  20. }
  21. };

发表评论

表情:
评论列表 (有 0 条评论,235人围观)

还没有评论,来说两句吧...

相关阅读