leetcode 70-爬楼梯 python

本文探讨了经典的爬楼梯问题,分析了递归与递推两种解决方案。通过具体示例,对比了两种方法的优缺点,并详细介绍了如何利用斐波那契数列思想优化算法,提高效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。

每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

注意:给定 n 是一个正整数。

示例:

输入: 2
输出: 2
解释: 有两种方法可以爬到楼顶。
1.  1 阶 + 1 阶
2.  2 阶
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶。
1.  1 阶 + 1 阶 + 1 阶
2.  1 阶 + 2 阶
3.  2 阶 + 1 阶

第一反应使用递归,递归就是调用函数本身,优点就是代码简洁,但带来的就是时间和空间消耗较大。每一次的函数调动都会在内存栈中分配空间保存参数,返回地址以及临时变量,而且往栈里面压入数据和弹出都需要时间。

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n == 1:
            return 1
        elif n == 2:
            return 2
        else:
            a = self.climbStairs(n-1)
            b = self.climbStairs(n-2)
            return a + b

​

​

提交的答案超出时间限制,就要考虑使用递推的方法解决这个问题。不同于递归是自己调用自己,递推并不是这样;而且递推不是将问题从复杂变为简单,而是从简单一步步先前发展,得到最终答案,是一个正向的过程;而且递推并不需要知道这里的n;最后,在可以计算的情况下递推的效率是高于递归的。

下面这个代码用到了斐波那契数列的思想:想不到啊= =

class Solution:
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        num = [0, 1, 2]
        if n == 1:
            return num[1]
        if n == 2:
            return num[2]
        else:
            for i in range(3, n+1):
                num.append(num[i-1]+num[i-2])
            return num[n]

 

<think>我们被要求回答LeetCode70题“爬楼梯”的解题思路,重点在动态规划和递归方法。根据引用内容,我们可以总结如下:1.问题描述:爬楼梯,每次可以爬1或2个台阶,到达第n阶有多少种不同的方法。2.动态规划是解决此问题的典型方法,状态转移方程为:dp[i]=dp[i-1]+dp[i-2]。3.递归方法虽然直观,但存在重复计算,可能导致超时,可以使用记忆化搜索优化(Top-DownDP)。4.动态规划(自底向上)通常使用数组存储中间结果,然后进行空间优化(例如用两个变量代替数组)。我们将按照以下结构组织回答:一、问题描述二、思路分析(递归关系)三、递归方法(及优化)四、动态规划方法(及优化)五、总结同时,根据要求,我们需要在回答末尾生成相关问题。注意:所有数学表达式(包括变量、方程)使用$...$格式,独立公式使用$$...$$格式。回答使用中文。引用标识:在引用的内容末尾添加[^1]、[^2]等,但注意我们引用的内容来自用户提供的引用[1]到[4]。</think>### LeetCode 70爬楼梯|动态规划与递归解析 #### 一、问题描述 给定楼梯阶数 $n$,每次可爬 $1$ 或 $2$ 阶,求到达第 $n$ 阶的不同方法总数。 #### 二、核心思路 **状态转移方程**: $$ dp[i] = dp[i-1] + dp[i-2] $$ 其中 $dp[i]$ 表示到达第 $i$ 阶的方法数。该方程源于:第 $i$ 阶只能从 $i-1$ 阶(爬 $1$ 阶)或 $i-2$ 阶(爬 $2$ 阶)到达[^2][^4]。 --- #### 三、动态规划解法(推荐) **自底向上迭代**,避免递归重复计算: ```python def climbStairs(n: int) -> int: if n <= 2: return n # 边界处理 dp = [0] * (n+1) dp[1], dp[2] = 1, 2 # 初始状态 for i in range(3, n+1): dp[i] = dp[i-1] + dp[i-2] # 状态转移 return dp[n] ``` **空间优化**(滚动变量): 仅需存储前两个状态,空间复杂度优化至 $O(1)$: ```python def climbStairs(n: int) -> int: if n <= 2: return n a, b = 1, 2 # a=dp[i-2], b=dp[i-1] for _ in range(3, n+1): a, b = b, a + b # 更新状态 return b ``` --- #### 四、递归解法(需优化) **基础递归**(不推荐): 直接实现状态方程,但存在指数级重复计算: ```python def climbStairs(n: int) -> int: if n == 1: return 1 if n == 2: return 2 return climbStairs(n-1) + climbStairs(n-2) # 递归分解 ``` **问题**:计算 $dp[5]$ 需重复计算 $dp[3]$ 和 $dp[4]$,时间复杂度 $O(2^n)$,$n=45$ 时超时[^3]。 **优化:记忆化搜索(Top-Down DP)** 添加缓存避免重复计算,时间复杂度降为 $O(n)$: ```python def climbStairs(n: int) -> int: memo = {} # 记忆字典 def dfs(k): if k <= 2: return k if k not in memo: memo[k] = dfs(k-1) + dfs(k-2) # 缓存结果 return memo[k] return dfs(n) ``` --- #### 五、复杂度对比 | 方法 | 时间复杂度 | 空间复杂度 | 适用性 | |---------------|------------|------------|----------------| | 基础递归 | $O(2^n)$ | $O(n)$ | 仅小 $n$ | | 记忆化搜索 | $O(n)$ | $O(n)$ | 需额外缓存 | | 动态规划 | $O(n)$ | $O(n)$ | 通用 | | **空间优化DP**| $O(n)$ | $O(1)$ | **最优解** | > **总结**:动态规划(尤其空间优化版)是本题最佳解法。其本质是斐波那契数列问题,状态转移方程 $dp[i]=dp[i-1]+dp[i-2]$ 是核心[^1][^2]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值