每天五分钟:leetcode动态规划-递归与递推_day2

0)先记住一句话(贯穿两种写法)

到第 n 阶的方法数:

  • 最后一步要么走 1 阶:从 n-1

  • 要么走 2 阶:从 n-2

所以永远是:

f(n) = f(n-1) + f(n-2)


1)递归版本(从"大问题"往下问"小问题")

✅ 1.1 纯递归(不推荐:会爆炸慢)

想法 :我想知道 f(n),那就去问 f(n-1)f(n-2)

python 复制代码
def climbStairs(n):
    if n <= 2:
        return n
    return climbStairs(n-1) + climbStairs(n-2)

为什么慢?

因为它会"重复算同一个问题":

比如算 f(5)

复制代码
f(5)=f(4)+f(3)

f(4)=f(3)+f(2)

f(3)=f(2)+f(1)

你看:f(3)f(2) 被算了很多遍。

复杂度 :接近 O(2^n),n 稍大就非常慢。


✅ 1.2 递归 + 记忆化(推荐:递归也能很快)

核心 :每个 f(k) 只算一次,算过就记下来,下次直接拿。

python 复制代码
def climbStairs(n):
    memo = {}

    def dfs(k):
        if k <= 2:
            return k
        if k in memo:
            return memo[k]
        memo[k] = dfs(k-1) + dfs(k-2)
        return memo[k]

    return dfs(n)

复杂度O(n)

因为 1...n 每个值只算一次。


2)递推版本(从"小问题"一路推到"大问题")

递推就是:我先知道最小的答案,然后一步步算到 n。

✅ 2.1 DP 数组版(最直观)

python 复制代码
dp[i] 代表到 i 阶的方法数

从 i=3 推到 n

复杂度O(n) 时间,O(n) 空间。


✅ 2.2 空间优化版(你写的版本:最常用

观察转移方程:

dp[i] 只依赖 dp[i-1]dp[i-2]

所以没必要保存整个数组,只保留最近两个数就够了。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        if n <= 2:
            return n
        a, b = 1, 2  # dp[1], dp[2]
        for _ in range(3, n + 1):
            a, b = b, a + b
        return b

复杂度O(n) 时间,O(1) 空间。

3)递归 vs 递推:一眼对比

写法 思维方向 是否重复计算 时间复杂度 空间复杂度
纯递归 自顶向下(n→1) ✅会大量重复 O(2^n) O(n) 递归栈
递归+记忆化 自顶向下(n→1) ❌不重复 O(n) O(n)
递推 DP 数组 自底向上(1→n) ❌不重复 O(n) O(n)
递推 空间优化 自底向上(1→n) ❌不重复 O(n) O(1)

4)一句话解释

  • 递归:像问路------"到第 n 阶怎么走?那我先问到 n-1 怎么走,再问到 n-2 怎么走。"

  • 递推:像建楼------"先把 1 阶、2 阶的答案写出来,然后一层层推上去。"

相关推荐
无极低码2 小时前
ecGlypher新手安装分步指南(标准化流程)
人工智能·算法·自然语言处理·大模型·rag
软件算法开发2 小时前
基于海象优化算法的LSTM网络模型(WOA-LSTM)的一维时间序列预测matlab仿真
算法·matlab·lstm·一维时间序列预测·woa-lstm·海象优化
superior tigre3 小时前
22 括号生成
算法·深度优先
努力也学不会java4 小时前
【缓存算法】一篇文章带你彻底搞懂面试高频题LRU/LFU
java·数据结构·人工智能·算法·缓存·面试
旖-旎5 小时前
二分查找(x的平方根)(4)
c++·算法·二分查找·力扣·双指针
ECT-OS-JiuHuaShan5 小时前
朱梁万有递归元定理,重构《易经》
算法·重构
智者知已应修善业5 小时前
【51单片机独立按键控制数码管移动反向,2片74CH573/74CH273段和位,按键按下保持原状态】2023-3-25
经验分享·笔记·单片机·嵌入式硬件·算法·51单片机
khddvbe6 小时前
C++并发编程中的死锁避免
开发语言·c++·算法
C羊驼6 小时前
C语言:两天打鱼,三天晒网
c语言·经验分享·笔记·算法·青少年编程
菜菜小狗的学习笔记6 小时前
剑指Offer算法题(四)链表
数据结构·算法·链表