爬楼梯
- 题目
- 题目描述
- 示例 1:
- 示例 2:
- 提示:
- 题解
- 思路分析
- Python 实现代码
- 空间优化
- 代码解释
- 提交结果
题目
题目描述
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
提示:
1 <= n <= 45
题解
思路分析
这个问题可以通过动态规划(Dynamic Programming, DP)来解决。我们定义 dp[i]
表示到达第 i
阶的方法总数。根据题目描述,每次可以选择爬 1 个台阶或 2 个台阶,因此:
- 如果最后一步是爬了 1 个台阶,那么剩下的部分就是
dp[i-1]
。 - 如果最后一步是爬了 2 个台阶,那么剩下的部分就是
dp[i-2]
。
所以,状态转移方程为:
[ dp[i] = dp[i-1] + dp[i-2] ]
这实际上是一个斐波那契数列问题,其中 dp[0] = 1
(从地面开始也算一种方式),dp[1] = 1
。
Python 实现代码
def climbStairs(n: int) -> int:
if n == 1:
return 1
# 初始化 dp 数组
dp = [0] * (n + 1)
dp[0], dp[1] = 1, 1
# 填充 dp 数组
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
空间优化
注意到在上面的实现中,我们只需要前两个状态值 dp[i-1]
和 dp[i-2]
来更新当前的状态 dp[i]
,因此可以进一步优化空间复杂度为 O(1),只使用两个变量来存储这两个状态值。
def climbStairs_optimized(n: int) -> int:
if n == 1:
return 1
# 初始化前两个状态值
prev, curr = 1, 1
for i in range(2, n + 1):
temp = curr
curr = prev + curr
prev = temp
return curr
代码解释
-
初始化边界条件:
- 当
n == 1
时,直接返回 1,因为只有一种方法爬到第一阶。
- 当
-
动态规划数组:
dp[0]
和dp[1]
分别初始化为 1,表示到达第 0 阶和第 1 阶的方法数。
-
状态转移:
- 对于每一个
i
,通过dp[i] = dp[i-1] + dp[i-2]
计算到达第i
阶的方法数。
- 对于每一个
-
返回结果:
- 最终返回
dp[n]
,即到达第n
阶的方法数。
- 最终返回
-
空间优化版本:
- 使用两个变量
prev
和curr
来代替整个dp
数组,从而将空间复杂度降低到 O(1)。
- 使用两个变量
这种方法的时间复杂度为 O(n),因为我们只需要遍历一次从 2 到 n 的所有整数。而空间优化后的版本更是将空间复杂度降到了常数级别,非常适合处理较大的输入值(如题目提示中的 1 <= n <= 45)。