返回

细数动态规划下的经典之作——70. 爬楼梯详解

闲谈

### 迈向成功之巅,一道备受青睐的LeetCode题目

在踏入LeetCode的征程中,第70题——爬楼梯,可谓是经典中的经典,也是程序员们必刷的一道动态规划题目。它以简洁的引出了一个耐人寻味的问题:你正在爬楼梯,需要n阶你才能到达楼顶,每次你可以爬1或2个台阶,你有多少种不同的方法可以爬到楼顶呢?

### 探索解题思路

### 斐波那契的幽灵与动态规划的救赎

一道优秀的题目往往蕴含着深刻的解题之道。对70. 爬楼梯的分析也不例外。在这个问题中,每一步都有两种选择,或爬1级,或爬2级。因此,到第n级台阶时,总共有两种方法:

1. 从第n-1级台阶爬1级到达n级台阶。
2. 从第n-2级台阶爬2级到达n级台阶。

这两种方法互相独立,互不干扰。根据数学归纳法,我们可以推出递推关系:

**F(n) = F(n-1) + F(n-2),其中F(n)为爬到第n级台阶的方法数** 。

仔细观察这个递推关系,你会发现它与著名的斐波那契数列有着异曲同工之妙。斐波那契数列的定义为:

**F(n) = F(n-1) + F(n-2),其中F(0) = 0,F(1) = 1** 。

### 递归和备忘录的双剑合璧

既然爬楼梯的方法数与斐波那契数列有着密切联系,我们可以借用斐波那契数列的求解方法来解决这个难题。一种常见的方法是递归。然而,递归虽然简单易懂,但它的缺点也很明显——时间复杂度较高。

为了克服递归的性能瓶颈,我们可以引入备忘录技术。备忘录是一种将已经计算过的结果存储起来,避免重复计算的技术。在70. 爬楼梯中,我们可以将已经计算过的子问题的答案存储在备忘录中,当需要再次计算时,直接从备忘录中获取,从而大大减少计算量。

### 递推关系的奏鸣曲

除了递归和备忘录,我们还可以使用递推关系来解决70. 爬楼梯。递推关系是一种从已知结果推导出未知结果的方法。在70. 爬楼梯中,我们可以使用递推关系来计算从第n-1级台阶和第n-2级台阶到第n级台阶的方法数,进而得到从第1级台阶到第n级台阶的方法数。

### 示例代码

```python
def climbStairs(n):
    """
    :type n: int
    :rtype: 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]

# 使用
n = 4
print(climbStairs(n))
```

### 总结与延伸

70. 爬楼梯是一道经典的动态规划题目,它不仅考察了对动态规划思想的理解,还涉及到了斐波那契数列、递归、备忘录和递推关系等多种概念。通过对这道题目的深入学习,相信您已经对动态规划有了更深刻的认识。

动态规划的思想不局限于70. 爬楼梯这一道题目,它在计算机科学领域有着广泛的应用,比如最长公共子序列、最短路径、背包问题等。如果您想进一步提高自己的算法能力,不妨深入学习动态规划的思想和技巧。

希望这篇文章能帮助您更好地理解70. 爬楼梯这道题目,并在LeetCode的征程中取得更大的进步!