Skip to main content

70.爬楼梯

标签: dynamic-programming

难度: Easy

通过率: 53.26%

原题链接: https://leetcode.com/problems/climbing-stairs/description/

题目描述

你正在爬楼梯。需要 nn 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶?

解题思路

这个问题的解法主要运用动态规划思想。因为每次可以选择爬1个台阶或2个台阶,因此到达第 nn 阶楼梯的方法可以通过以下两种情况累加得到:

  • 从第 n1n-1 阶爬1个台阶。
  • 从第 n2n-2 阶爬2个台阶。

因此,可以设定一个动态规划数组 dpdp,其中 dp[i]dp[i] 代表到达第 ii 阶楼梯的方法总数。

状态转移方程为: [ dp[i] = dp[i-1] + dp[i-2] ]

初始条件:

  • dp[0]=1dp[0] = 1,因为在地面不需要爬台阶。
  • dp[1]=1dp[1] = 1,因为到达第一阶只有一种方法。

最后 dp[n]dp[n] 就是所求的答案。

代码实现

def climbStairs(n):
# 处理特殊情况,当 n 为 1 时,直接返回 1
if n == 1:
return 1

# 初始化dp数组,dp[i]表示到达第i阶的方法数
dp = [0] * (n + 1)
dp[0], dp[1] = 1, 1

# 自底向上计算每一个楼梯阶的结果
for i in range(2, n + 1):
dp[i] = dp[i - 1] + dp[i - 2]

# 返回到达第n阶的方法数
return dp[n]

复杂度分析

时间复杂度:O(n)O(n),因为我们遍历了一次从 22nn 的循环。

空间复杂度:O(n)O(n),使用了大小为 n+1n+1 的数组来存储计算结果。