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?
开始觉得并不难, 最初思路是用2 steps的出现次数做循环, 每次循环计算出2steps出现在不同地方的可能性. 经过一轮努力始终得不到一个common function最终放弃.
查阅网上解决方案后得知有一种数列叫斐波那契数列-Fibonacci!!! (基础不好是硬伤). 大概意思是每一个数是前面两个数字之和. e.g. a1 = 1, a2 = 2,于是a3 = a1+a2 = 3, a4 = a2 + a3 = 5.
回到我们的题目, 攀登n级楼梯方法数其实是等于攀登n-1级楼梯的方法数+攀登n-2级楼梯的方法数. 也就是说如果我们已经攀到n-1级,下一步只需要再上一次1step就到n级; 而如果我们已经攀到第n-2级, 下一步只需要再上一次2 step就可以登上n级楼梯. 注意由于最后一步攀登的级数不同, 于是这两set攀登方法(n-1, n-2)没有任何重复.
于是最直接的递归实现为
public class Solution {
public int climbStairs(int n) {
if (n<2) return 1;
return climbStairs(n-1) + climbStairs(n-2);
}
}
运行结果提示超时!
于是将递归改为循环:
public class Solution {
public int climbStairs(int n) {
if (n<2) return 1;
int step1 = 1;
int step2 = 1;
for (int i=2; i<=n; i++){
int stepn = step1 + step2;
step1 = step2;
step2 = stepn;
}
return step2;
}
}