题目描述:
你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
示例 1:
输入:n = 2
输出:2
解释:有两种方法可以爬到楼顶。
- 1 阶 + 1 阶
- 2 阶
示例 2:
输入:n = 3
输出:3
解释:有三种方法可以爬到楼顶。
- 1 阶 + 1 阶 + 1 阶
- 1 阶 + 2 阶
- 2 阶 + 1 阶
解题思路:
这个问题实际上是一个斐波那契数列问题。假设 f(n)
表示爬到第 n
阶的方法数,那么有以下递推关系:
f(1) = 1
,只有一种方法,即爬 1 阶。f(2) = 2
,有两种方法,即爬两个 1 阶或者一次爬 2 阶。- 对于
n > 2
,可以从第n-1
阶爬 1 阶到达第n
阶,或者从第n-2
阶爬 2 阶到达第n
阶。因此,f(n) = f(n-1) + f(n-2)
。
基于这个递推关系,可以使用动态规划的方法来求解。
动态规划解法:
- 定义状态: 用
dp[i]
表示爬到第i
阶的方法数。 - 状态转移方程:
dp[i] = dp[i-1] + dp[i-2]
。 - 初始状态:
dp[1] = 1
,dp[2] = 2
。 - 返回结果:
dp[n]
。
代码实现(Python):
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
if n == 2:
return 2
dp = [0] * (n + 1)
dp[1] = 1
dp[2] = 2
for i in range(3, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]
return dp[n]
优化空间复杂度:
由于每次状态转移只依赖于前两个状态,可以使用两个变量来存储这两个状态,从而将空间复杂度从 O(n) 优化到 O(1)。
优化后的代码(Python):
class Solution:
def climbStairs(self, n: int) -> int:
if n == 1:
return 1
if n == 2:
return 2
a, b = 1, 2
for i in range(3, n + 1):
a, b = b, a + b
return b
总结:
这个问题通过动态规划的方法可以高效解决。关键在于识别出问题的递推关系,并利用动态规划的思想进行状态转移。优化空间复杂度后,代码更加简洁且效率更高。
希望这个详细的解答对你有所帮助!如果有其他问题,欢迎继续提问。
发表回复