70. 爬楼梯
class Solution:
def climbStairs(self, n: int) -> int:
dp=[0]*(n+1)
dp[0]=dp[1]=1
for i in range(2, n+1):
dp[i]=dp[i-1]+dp[i-2]
return dp[n]
TODO: 常数时间复杂度
变态跳台阶:
f ( n ) = 2 f ( n − 1 ) f(n)=2f(n-1) f(n)=2f(n−1)
# -*- coding:utf-8 -*-
class Solution:
def jumpFloorII(self, number):
# write code here
if number <= 2:
return number
total = 1
for _ in range(1, number):
total *= 2
return total
跳台阶,不能连续跳2阶
f
f
f: 跳到n阶的总方法数
g
g
g: 最后一步跳一阶跳到n阶的总方法数
初始值:
f
=
[
1
,
2
,
3
]
f=[1,2,3]
f=[1,2,3]
g
=
[
1
,
1
,
2
]
g=[1,1,2]
g=[1,1,2]
初始值很容易求得, f f f不用说, g g g可以用 g ( n ) = f ( n − 1 ) g(n)=f(n-1) g(n)=f(n−1)求得
f ( n ) = f ( n − 1 ) + g ( n − 2 ) f(n)=f(n-1)+g(n-2) f(n)=f(n−1)+g(n−2)
解释:跳一步+跳两步。跳两步是最后一步跳一阶的情况
g ( n ) = f ( n − 1 ) g(n)=f(n-1) g(n)=f(n−1)
解释:最后一步跳一阶
有趣的是,这两个递推公式可以合并
public int modifiedJumpStairs(int n) {
if (n <= 3)
return n;
int[] dp = new int[n];
for (int i = 0; i < n; i++) {
if (i <= 2) {
dp[i] = i+1;
} else {
dp[i] = dp[i-1] + dp[i-3];
}
}
return dp[dp.length-1];
}