leetcode热题100.爬楼梯(从递归到动态规划)

Problem: 70. 爬楼梯

文章目录

题目

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

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

示例 1:

输入:n = 2

输出:2

解释:有两种方法可以爬到楼顶。

  1. 1 阶 + 1 阶

  2. 2 阶

示例 2:

输入:n = 3

输出:3

解释:有三种方法可以爬到楼顶。

  1. 1 阶 + 1 阶 + 1 阶
  2. 1 阶 + 2 阶
  3. 2 阶 + 1 阶

递归

假设 n=8,我们可以分情况讨论:

  • 假如最后一步走了1个台阶,那么我们的问题可以缩小成:到达第7个台阶有多少种方法
  • 加入最后一步走了2个台阶,我们的问题可以缩小成:到达第6个台阶有多少种方法

综上所述,设f(n)为到达第层的方法数,则 f ( 8 ) = f ( 7 ) + f ( 6 ) f(8) = f(7) + f(6) f(8)=f(7)+f(6)

我们推广一下得到这样的公式:
f ( n ) = f ( n − 1 ) + f ( n − 2 ) f(n) = f(n-1) + f(n-2) f(n)=f(n−1)+f(n−2)

递归的出口为 f(1) = 1,f(0) = 0

我们先用递归的方法写一遍

bash 复制代码
# 会超时的递归代码
class Solution:
    def climbStairs(self, n: int) -> int:
        def dfs(i: int) -> int:
            if i <= 1:  # 递归边界
                return 1
            return dfs(i - 1) + dfs(i - 2)
        return dfs(n)

复杂度分析:

  • 时间复杂度: o ( 2 n ) o(2^n) o(2n),搜索树可以近似为一棵二叉树,树高为 o ( n ) o(n) o(n),所以节点数为 o ( 2 n ) o(2^n) o(2n)
  • 空间复杂度: o ( n ) o(n) o(n),递归需要n层的空间

我们尝试优化一下算法,我们观察上面的递归时发现,我们的递归函数很多时候入参是相同的,比如n为19,那么对于它的子状态f(17)和f(18)而言,f(16)这个状态都是要算一遍的,那么我们可不可以在第一次计算f(16)的时候就缓存一下f(16),避免重复计算呢?答案是,当然可以。

这里我们用Python的注解实现了缓存,其实就和Java的hashMap一样

bash 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        @cache
        def dfs(i: int) -> int:
            if i <= 1:  # 递归边界
                return 1
            return dfs(i - 1) + dfs(i - 2)
        return dfs(n)

复杂度分析

  • 时间复杂度: o ( n ) o(n) o(n),一共有n个数字要算
  • 空间复杂度: o ( n ) o(n) o(n),我们保存了n个数的答案

递推

我们发现f(n)的状态可以从f(n-1)和f(n-2)这两个状态转化过来,那么我们换一种角度思考,我们可以不可以直接从下往上的递归出f(n)呢?这当然也是可以的。

python 复制代码
class Solution:
    def climbStairs(self, n: int) -> int:
        a,b,c = 0,0,1
        for i in range(n):
            a = b
            b = c
            c = a+b
        return c

复杂度分析

  • 时间复杂度:计算了n次, o ( n ) o(n) o(n)
  • 空间复杂度:常数级的空间 o ( 1 ) o(1) o(1)

下一篇我们讲讲如何通过矩阵快速幂求解这个问题,将时间复杂度进一步优化。

相关推荐
小智老师PMP5 分钟前
零基础能不能考PMP?零基础专属学习路径+全套扶持体系
学习·算法·职场和发展·软件工程·求职招聘·敏捷流程
Dillon Dong15 分钟前
【风电控制】FPGA采集Vdc的ADC增益系数解析——从数字码到实际电压的桥梁
算法·fpga开发·变流器·风电控制
TDengine (老段)21 分钟前
TDengine 压缩编码机制 — 双层压缩架构与类型特化算法
大数据·数据库·物联网·算法·时序数据库·tdengine·涛思数据
不会就选b23 分钟前
数据结构之顺序表和链表的OJ题(上)
数据结构·链表
妄想出头的工业炼药师1 小时前
LVIO鲁棒
算法·开源
aini_lovee2 小时前
MATLAB 图像修复 — 偏微分方程方法
算法
Cthy_hy2 小时前
Python算法竞赛:排列组合核心用法
开发语言·python·算法
大圣编程2 小时前
面向对象深度理解
java·开发语言·算法
爱喝水的鱼丶2 小时前
SAP-ABAP:SAP 简单报表输出开发系列(共6篇) 第四篇:SAP 报表异常处理机制:数据校验与消息提示规范落地
开发语言·数据库·学习·算法·sap·abap
wabs6663 小时前
关于贪心算法【划分字母区间】的问题总结(C++语法)
算法·贪心算法