AlgoMooc
你已开通华为OD训练营权益,还差最后一步——完成入营激活(兑换课程 + 加飞书 + 登记服务群),即可解锁全部课程与专属服务。去激活 →
← OD 20 天课程

华为 OD 训练营 · 题解精讲

LC70. 爬楼梯

配套讲解:视频讲解

LC70. 爬楼梯 视频地址:https://uha.xet.tech/s/4uamcb

题目描述

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 示例 1: 输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1 阶 + 1 阶 2 阶 示例 2: 输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶 提示: 1 <= n <= 45

题目解析

解题思路

本题是经典的斐波那契数列问题。到达第 n 阶的方法数等于到达第 n-1 阶的方法数(再爬 1 阶)加上到达第 n-2 阶的方法数(再爬 2 阶),即递推公式 f(n) = f(n-1) + f(n-2),边界条件为 f(1)=1f(2)=2

参考代码给出了三种实现方式,但实际做法完全一致:动态规划(自底向上)。第三种代码是最终版本,使用数组 memo 记录子问题的解,从 3n 依次计算,避免了递归重复计算。

关键步骤

1. 处理边界n=1 返回 1,n=2 返回 2。 2. 初始化数组memo = [0] * (n+1),并设置 memo[1]=1memo[2]=2。 3. 递推计算:从 i=3n,执行 memo[i] = memo[i-1] + memo[i-2]。 4. 返回结果return memo[n]

递推过程示意(以 n=4 为例):


memo[1]=1, memo[2]=2
i=3: memo[3] = memo[2] + memo[1] = 2+1=3
i=4: memo[4] = memo[3] + memo[2] = 3+2=5

复杂度分析

  • 时间复杂度O(n),只需一次线性遍历。
  • 空间复杂度O(n),使用长度为 n+1 的数组存储中间结果。

参考代码

class Solution:
    def climbStairs(self, n):
        return self.calcWays(n)

    def calcWays(self, n):
        if n == 1:
            return 1
        if n == 2:
            return 2
        return self.calcWays(n - 1) + self.calcWays(n - 2)
代码
class Solution:
    def climbStairs(self, n):
        self.memo = [-1] * (n + 1)
        return self.calcWays(n)

    def calcWays(self, n):
        if n == 1:
            return 1
        if n == 2:
            return 2
        if self.memo[n] == -1:
            self.memo[n] = self.calcWays(n - 1) + self.calcWays(n - 2)
        return self.memo[n]
代码
class Solution:
    def climbStairs(self, n):
        if n == 1:
            return 1
        if n == 2:
            return 2

        memo = [0] * (n + 1)
        memo[1] = 1
        memo[2] = 2

        for i in range(3, n + 1):
            memo[i] = memo[i - 1] + memo[i - 2]

        return memo[n]