假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?【LeetCode Hot 100】

力扣热题100之第70题:

先贴代码:

class Solution {
    public int climbStairs(int n) {
        //爬完n阶所需的方法:f(n) = f(n-1) + f(n-2)
        int a = 0; //定义a为n-2阶需要的方法数
        int b = 0; //定义b为n-1阶需要的方法数
        int method = 1; //method为n阶需要的方法数

        //i为当前的阶数,从第1阶开始计算
        for(int i = 1;i <= n;i++){
            a = b;
            b = method;
            method = a+b;
        }
        return method;
    }
}

这一题其实就是大名鼎鼎的青蛙跳台阶问题。这一题的解题思路其实就是运用递归思想,但是在力扣中使用递归会提示超时。

解题思路:一个小青蛙每次只能跳一级或者二级台阶,一个n级的台阶一共有几次跳法呢?

当阶梯有一级、二级、三级时,分别有:

 当阶梯有四级时:

 当阶梯数为5时,共有8种跳法,这里我就不画了。我们先假设一个临界情况,即当阶梯数为0时,共有跳法1种,即站着不动。所以我们就能得出,当阶梯数等于3时,该阶梯数的跳法就为阶梯数为2的跳法加上阶梯数的1的跳法,以此类推。当阶梯数为n时,总共的跳法F(n) = F(n-1) + F(n-2)。

我们就能发现,这不就是斐波那契数列嘛!于是借助这个思想,就可以用递归来解决这个问题:

class Solution {
    public int climbStairs(int n) {
        //当阶梯数为1或者2时,一共可能的跳法数量就为1或者2
        if (n==1 || n==2){
            return n;
        }else{    //此时阶梯数n >= 3,跳法就为阶梯数为n-1的跳法加上阶梯数为n-2时的跳法
            return climbStairs(n-1)+climbStairs(n-2);
        }
    }
}

但是在力扣中这个解放会提示超时,所以我们可以用循环来写,思路也是一样的。

定义一个数a为阶梯数为n-1时的跳法,数b为阶梯数为n-2时的跳法。那么当阶梯数为0时,跳法有一种,即定义一个数c,表示当前阶梯总共的跳法,初始值为1。

当阶梯数为n时,跳法就是:

class Solution {
    public int climbStairs(int n) {
         int a = 0;    //a为n-2时的跳法
         int b = 0;    //b为n-1时的跳法
         int c = 1;    //c为n时的跳法
         //以上的初始值,表示阶梯数为0时,各阶梯的状态

         //i表示阶梯数,当i为1时,总共跳法为1······
         for(int i = 1;i <= n;i++){
             a = b;
             b = c;
             c = a + b;
         }
         return c;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_56960711/article/details/123281782