和打家劫舍一样的思路
1.看如何到最后一步的
①跨一级台阶到
②跨两级台阶到
则:f(x) = f(x-1) + f(x-2)
f(x)是爬到x阶的方案数量
2.考虑边界
台阶有0、1阶时只有一种方案;
f(2) = 2
f(3)= 3
...
本质斐波那契数列
这里用打家劫舍利一样用到的滚动数组
直接上代码:
java
class Solution {
public int climbStairs(int n) {
int p = 0, q = 0, r = 1;
for (int i = 1; i <= n; ++i) {
p = q;
q = r;
r = p + q;
}
return r;
}
}
p即为f(i-2),q即为f(i-1),r即为当前台阶f(i),到达当前台阶的方法数目
官方给的图多看看:70_fig1.gif (1080×480)
方便for循环直接一次性解决所有问题,像上面这样写就不用考虑前两个特殊情况了
或者这样也行:
java
class Solution {
public int climbStairs(int n) {
int p = 1;
int q = 1;
int r = 2;
if (n == 1 ){return 1;}
if (n == 2 ){return 2;}
for(int i = 3; i <= n; i ++){
p = q;
q = r;
r = p + q;
}
return r;
}
}
其实都是一样的,无非是向前或向后延长两个位置