力扣热题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;
}
}