很简单的动态规划问题(我信你个鬼),跳
n
n
n级台阶只能从
n
−
1
n-1
n−1级台阶跳一步或者从
n
−
2
n-2
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),剩下的就是和斐波拉契数列一样的求法了。
算法复杂度
- 时间复杂度: O ( n ) O(n) O(n),遍历n个数
- 空间复杂度: O ( 1 ) O(1) O(1),没有引入额外的空间
// 很简单的动态规划问题,设跳n级台阶跳法为f(n)
// 那么f(n) = f(n - 1) + f(n - 2)
// 实际上就是斐波拉契数列,注意防止溢出
class Solution {
public int numWays(int n) {
if(n <= 1)
return 1;
if(n == 2)
return 2;
// a用于存储f(n - 2), b为f(n - 1),c为f(n)
int a = 1;
int b = 2;
int c = 0;
for(int i = 2; i < n; i++){
c = (a + b) % 1000000007;
a = b;
b = c;
}
return c;
}
}