问题
方法一-动态规划
设跳上 n 级台阶有 f ( n ) f(n) f(n) 种跳法,最后一步要么跳1级要么跳2级:
- 最后一步跳1级:前面已有 n-1 级台阶,该情况下共有 f ( n − 1 ) f(n-1) f(n−1) 种跳法
- 最后一步跳2级:前面已有 n-2 级台阶,该情况下共有 f ( n − 2 ) f(n-2) f(n−2) 种跳法
故
f
(
n
)
=
f
(
n
−
1
)
+
f
(
n
−
2
)
f(n)=f(n-1)+f(n-2)
f(n)=f(n−1)+f(n−2) ,与10-I 斐波那契数列等价,只是起始数字不同。
本问题
f
(
0
)
=
1
f(0)=1
f(0)=1,
f
(
1
)
=
1
f(1)=1
f(1)=1,
f
(
2
)
=
2
f(2)=2
f(2)=2
class Solution {
public int numWays(int n) {
int a = 1, b = 1, sum;
for(int i = 0; i < n; i++){
sum = (a + b)%1000000007;
a = b;
b = sum;
}
return a;
}
}
- 时间复杂度: O ( n ) O(n) O(n),循环 n 次,每轮循环内计算操作需要 O ( 1 ) O(1) O(1)
- 空间复杂度: O ( 1 ) O(1) O(1),3个变量使用常数大小的额外空间