当前位置: 首页 > news >正文

leetcode_动态规划/递归 70. 爬楼梯

70. 爬楼梯

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

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

  • 思路:

    • 考虑: 假设现在已经爬到了某一阶台阶,那是如何到达这里的呢?可能是从前一阶台阶爬上来的,也可能是从前两阶台阶爬上来的。也就是说,从第 i 阶楼梯,可以从第 i - 1 或者 i - 2 阶楼梯爬上来。因此,有一个递推公式:d[i] = d[i-1] + d[i-2]

1. 动态规划

# 1. 动态规划
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 1:
            return 0
        if n == 1:
            return 1
        elif n == 2:
            return 2
        
        d = [0] * (n + 1)  
        # 初始化列表长度为 n + 1, 所有元素的值为 0, 用来存储每个台阶的爬法数
        d[1] = 1  
        # 第 1 阶只有 1 种方式
        d[2] = 2  
        # 第 2 阶有 2 种方式
        
        # 从第 3 阶开始,根据递推公式计算每个台阶的爬法数
        for i in range(3, n + 1):
            d[i] = d[i - 1] + d[i - 2]
        
        # 返回到达第 n 阶的方法数
        return d[n]
  • 时间复杂度: O(n)
  • 空间复杂度: O(n)

空间优化版本

class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n < 1:
            return 0
        if n == 1:
            return 1
        elif n == 2:
            return 2
        
        # 使用两个变量来存储前两阶的爬法数
        prev1, prev2 = 2, 1  # prev1 是 d[i-1], prev2 是 d[i-2]
        
        for i in range(3, n + 1):
            current = prev1 + prev2
            prev2 = prev1
            prev1 = current
        
        # 返回最终的结果
        return prev1
  • 时间复杂度: O(n)
  • 空间复杂度: O(1)

2. 递归法

# 2. 递归(ps: 递归法在leetcode中运行会超时)
class Solution(object):
    def climbStairs(self, n):
        """
        :type n: int
        :rtype: int
        """
        if n <= 1:
            return 1
        return self.climbStairs(n-1) + self.climbStairs(n-2)
  • 时间复杂度: O(2^n),递归调用的过程形成了一个类似于树的结构,每一层都会有两个递归分支,导致时间复杂度呈指数级增长。总的递归调用数大约为 2^n,因此时间复杂度是 O(2^n)。
  • 空间复杂度: O(n),递归调用会在系统栈中占用空间,每一次递归都会添加一个新的栈帧,直到到达基准情况(n <= 1)。最深的递归调用栈的深度为 n(因为递归每次减少 1 或 2),所以空间复杂度是 O(n)。

相关文章:

  • Java String 类
  • 算法-图-数据结构(邻接矩阵)-BFS广度优先遍历
  • 【Python】mysql数据库增删查改
  • 数据库(MySQL)二
  • 番外·卓伊凡参加 [2025年2月HDD·鸿蒙赋能交流会·成都站] 线下活动的心得体会-优雅草卓伊凡
  • 【linux】文件与目录命令 - awk
  • 【Spark+Hadoop】基于Spark大数据小说数据分析推荐系统(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
  • 前缀和刷题-- LeetCode
  • 第四章:文本分类
  • 从零开始玩转TensorFlow:小明的机器学习故事 5
  • 欧拉筛法寻找素数与计算欧拉函数求和
  • 【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶
  • 服务器能否拒绝非浏览器发起的HTTP请求?
  • css文本两端对齐
  • 微信小程序 - 条件渲染(wx:if、hidden)与列表渲染(wx:for)
  • LeetCode-34. 在排序数组中查找元素的第一个和最后一个位置
  • 本地开发用ASP.NET Core Web API项目创建及测试
  • AF3 中扩散模型类总结
  • 使用C++实现简单的TCP服务器和客户端
  • 山东大学软件学院nosql实验四
  • 电子商务网站建设的方法/外贸推广如何做
  • 宁波方太集团网站建设/关键词的分类和优化
  • 网站开发网站设计的标准/2021年关键词排名
  • 易语言做返利网站/北京今日重大新闻
  • 武汉网站建设哪家好/社群推广平台
  • 企业网站cms源码/网络营销做的比较好的企业