在LeetCode中,爬楼梯问题是一个经典的动态规划问题。它主要考察我们对递归和动态规划的理解。

问题描述

假设你正在爬楼梯。每次你可以爬1个或2个台阶。你达到楼顶需要爬的总台阶数是n。请问,有多少种不同的方法可以爬到楼顶?

示例

假设楼梯有5个台阶,那么你可以这样爬:

  • 1, 1, 1, 1, 1
  • 1, 1, 1, 2
  • 1, 2, 1, 1
  • 2, 1, 1, 1
  • 1, 2, 2
  • 2, 1, 2
  • 2, 2, 1
  • 3, 1
  • 1, 3

总共有8种不同的方法可以爬到楼顶。

解题思路

这个问题可以通过递归或动态规划来解决。

递归解法

递归解法比较直观,但是效率较低。其基本思想是:如果楼梯有n个台阶,那么到达第n个台阶的方法数等于到达第n-1个台阶的方法数加上到达第n-2个台阶的方法数。

def climbing_stairs_recursive(n):
    if n == 1:
        return 1
    if n == 2:
        return 2
    return climbing_stairs_recursive(n-1) + climbing_stairs_recursive(n-2)

动态规划解法

动态规划解法效率更高。其基本思想是:将问题分解为子问题,并存储子问题的解,避免重复计算。

def climbing_stairs_dp(n):
    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]

扩展阅读

如果你对爬楼梯问题还有更多疑问,可以参考以下链接:

图片

楼梯