# 70. 爬楼梯
假设你正在爬楼梯。需要 n
阶你才能到达楼顶。
每次你可以爬 1
或 2
个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
1. 1 阶 + 1 阶
2. 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶
灵神题解
参考 https://leetcode.cn/problems/climbing-stairs/solutions/2560716/jiao-ni-yi-bu-bu-si-kao-dong-tai-gui-hua-7zm1/
# 记忆化搜索
class Solution: | |
def climbStairs(self, n: int) -> int: | |
@cache | |
def dfs(i: int) -> int: | |
if i <= 1: | |
return 1 | |
# 总方案数量 | |
ans = 0 | |
# 选择 i - 1 | |
ans += dfs(i - 1) | |
# 选择 i - 2 | |
ans += dfs(i - 2) | |
return ans | |
return dfs(n) |
# 动态规划
class Solution: | |
def climbStairs(self, n: int) -> int: | |
# dp [i]: 爬到第 i 阶的所有方法数 | |
# dp[i] = dp[i - 1] + dp[i - 2] | |
dp = [0] * (n + 1) | |
dp[0] = 1 | |
dp[1] = 1 | |
for i in range(2, n + 1): | |
dp[i] = dp[i - 2] + dp[i - 1] | |
return dp[n] |
# 空间优化
只需要知道 就行了。
class Solution: | |
def climbStairs(self, n: int) -> int: | |
# dp [i]: 爬到第 i 阶的所有方法数 | |
# dp[i] = dp[i - 1] + dp[i - 2] | |
n_i0 = 1 | |
n_i1 = 1 | |
n_i = 1 | |
for i in range(2, n + 1): | |
n_i = n_i0 + n_i1 | |
n_i0 = n_i1 | |
n_i1 = n_i | |
return n_i |