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

news/2025/2/26 12:55:11

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)。

http://www.niftyadmin.cn/n/5868726.html

相关文章

服务器硬件老化导致性能下降的排查与优化

当服务器硬件老化导致性能下降时&#xff0c;以下是一些排查和优化方法&#xff1a; ### 排查问题&#xff1a; 1. **性能监控&#xff1a;** - 使用监控工具&#xff08;如Prometheus、Grafana&#xff09;监视服务器性能指标&#xff0c;包括CPU利用率、内存使用、磁盘I…

使用python接入腾讯云DeepSeek

本文主要从提供SSE方式接入DeepSeek&#xff0c;并通过fastapi websocket对外提供接入方法。 参考文档&#xff1a; 腾讯云大模型&#xff1a;https://cloud.tencent.com/document/product/1759/109380 fastAPI官网&#xff1a;https://fastapi.tiangolo.com/ WebSocketManager…

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

STM32MP157A-FSMP1A单片机移植Linux系统SPI总线驱动

SPI总线驱动整体上与I2C总线驱动类型&#xff0c;差别主要在设备树和数据传输上&#xff0c;由于SPI是由4根线实现主从机的通信&#xff0c;在设备树上配置时需要对SPI进行设置。 原理图可知&#xff0c;数码管使用的SPI4对应了单片机上的PE11-->SPI4-NSS,PE12-->SPI4-S…

Java进阶:SpringMVC中放行静态资源

方法一 <mvc:resources mapping"/js/**" location"/js/"/>mapping&#xff1a;映射地址。访问服务器找资源时候的地址。 location&#xff1a;目录。具体资源所在目录。 方式二 <mvc:default-servlet-handler/>mvc如果找不到静态资源&…

娛閑放鬆篇3

2月的立春打算多添加兩隻貓&#xff0c;本來1月份黑漸層死了…但立春那天三花也撐不下去.....然後去了領貓的地方&#xff0c;只捉到了熟睡的三花&#xff0c;捉不到那隻橘白...幸好三天後捉到了...也是到家後一天才轉移到了貓籠&#xff0c;到家後兩天用吸管擼貓才不哈我&…

Spring Boot + Vue 接入腾讯云人脸识别API(SDK版本3.1.830)

一、需求分析 这次是基于一个Spring Boot Vue的在线考试系统进行二次开发&#xff0c;添加人脸识别功能以防止学生替考。其他有对应场景的也可按需接入API&#xff0c;方法大同小异。 主要有以下两个步骤&#xff1a; 人脸录入&#xff1a;将某个角色&#xff08;如学生&…

[算法--前缀和] 矩阵区域和

目录 1. 二维前缀和的知识铺垫2. 以nums[i][j]为中心计算区域大小.3. dp数组与ret数组之间的逻辑关系.4. 细节: 如果[i,j]为中心的数组越界了呢?下面继续分享一道用前缀和思想解决的算法问题 -> 矩阵区域和 1. 二维前缀和的知识铺垫 实际上, 有一道十分类似的基础题 ->…