LeetCode Hot100(64/100)——70. 爬楼梯

【hot100-动态规划-70.爬楼梯】 力扣第 70 题“爬楼梯”要求计算爬到 n 阶楼梯的不同方法数,每次可以爬 1 或 2 个台阶。该问题可以通过动态规划解决,定义 dp[i] 为到达第 i 阶的方法数,状态转移方程为 dp[i] = dp[i-1] + dp[i-2]。代码初始化 dp 数组为 [0, 1, 2],然后通过循环计算从第 3 阶到第 n 阶的方法数,最终返回 dp[n]。该方法的时间复杂度为 $O(n)$,空间复杂度为 $O(n)$。 阅读详情

题目链接

LeetCode 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 阶

提示:

  • 1 <= n <= 45

问题分析

这是一道经典的动态规划问题。我们来分析一下问题的本质:

要到达第 n 阶楼梯,只有两种可能:

  1. 从第 n-1 阶爬 1 步
  2. 从第 n-2 阶爬 2 步

因此,到达第 n 阶的方法数 = 到达第 n-1 阶的方法数 + 到达第 n-2 阶的方法数

这就是著名的斐波那契数列!

爬到第n阶

从第n-1阶爬1步

从第n-2阶爬2步

f n = f n-1 + f n-2

解法一:动态规划(自底向上)

原理讲解

动态规划的核心思想是将大问题分解为小问题,通过解决小问题来解决大问题。

对于爬楼梯问题:

  • 初始状态:f(1) = 1(只有1种方法),f(2) = 2(有2种方法)
  • 状态转移方程:f(n) = f(n-1) + f(n-2)
  • 从小到大依次计算,直到得到 f(n)

n=1: 1种

n=2: 2种

n=3: 3种

n=4: 5种

n=5: 8种

...

Java代码实现

class Solution {
    public int climbStairs(int n) {
        // 边界条件处理
        if (n <= 2) {
            return n;
        }
        
        // 创建dp数组,dp[i]表示爬到第i阶的方法数
        int[] dp = new int[n + 1];
        
        // 初始化基础状态
        dp[1] = 1;  // 爬到第1阶只有1种方法
        dp[2] = 2;  // 爬到第2阶有2种方法
        
        // 自底向上计算
        for (int i = 3; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }
        
        return dp[n];
    }
}

复杂度分析

  • 时间复杂度:O(n),需要遍历一次从 3 到 n 的所有数字
  • 空间复杂度:O(n),需要一个长度为 n+1 的数组存储中间结果

解法二:动态规划(空间优化)

原理讲解

观察解法一,我们发现计算 f(n) 时只需要 f(n-1) 和 f(n-2),不需要保存所有的历史状态。

因此可以用两个变量来代替整个数组,实现空间优化。

curr prev1 prev2 curr prev1 prev2 初始状态 计算n=3 滚动更新 继续计算... 1 2 prev1 + prev2 = 3 prev1 = 2 curr = 3

Java代码实现

class Solution {
    public int climbStairs(int n) {
        // 边界条件处理
        if (n <= 2) {
            return n;
        }
        
        // 只需要保存前两个状态
        int prev2 = 1;  // f(n-2)
        int prev1 = 2;  // f(n-1)
        int curr = 0;   // f(n)
        
        // 从第3阶开始计算
        for (int i = 3; i <= n; i++) {
            curr = prev1 + prev2;  // 状态转移
            prev2 = prev1;         // 滚动更新
            prev1 = curr;
        }
        
        return curr;
    }
}

复杂度分析

  • 时间复杂度:O(n),需要遍历一次从 3 到 n 的所有数字
  • 空间复杂度:O(1),只使用了常数个变量

解法三:递归(带记忆化)

原理讲解

递归是最直观的解法,直接按照递推公式实现。但纯递归会有大量重复计算,因此需要使用记忆化来优化。

f 5

f 4

f 3

f 3

f 2

f 2

f 1

f 2

f 1

红色节点表示重复计算

Java代码实现

class Solution {
    // 使用数组存储已计算的结果
    private int[] memo;
    
    public int climbStairs(int n) {
        memo = new int[n + 1];
        return climb(n);
    }
    
    private int climb(int n) {
        // 基础情况
        if (n <= 2) {
            return n;
        }
        
        // 如果已经计算过,直接返回
        if (memo[n] != 0) {
            return memo[n];
        }
        
        // 递归计算并存储结果
        memo[n] = climb(n - 1) + climb(n - 2);
        return memo[n];
    }
}

复杂度分析

  • 时间复杂度:O(n),每个子问题只计算一次
  • 空间复杂度:O(n),需要记忆化数组和递归调用栈

总结

爬楼梯问题是动态规划的入门经典题目,核心在于找到状态转移方程:f(n) = f(n-1) + f(n-2)

三种解法各有特点:

  • 动态规划数组版本最容易理解,适合初学者
  • 动态规划空间优化版本是最优解,实际应用推荐使用
  • 递归记忆化版本代码最简洁,有助于理解问题本质

掌握这道题目后,可以尝试类似的变种问题,如每次可以爬 1、2 或 3 个台阶,或者某些台阶不能踩等。

前端JavaScript力扣HOT100刷题【51-100】 注:纯手打,如有错误欢迎评论区交流!编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除!本文章将不定时更新,敬请期待!!!!! 阅读详情

相关推荐

Unity开发HoloLens应用:从打包到部署的完整指南

本文为Unity开发者提供了将应用部署到HoloLens设备的完整实战指南。详细讲解了从环境准备、Unity项目配置、生成Visual Studio工程,到最终构建APPX安装包并通过设备门户或Visual Studio进行部署的全流程,帮助开发者高效完成混合现实应用的打包与安装。

red88的博客 1018

leetcode | 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

假设你正在爬楼梯。需要n阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定n是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. ...

cong____cong的博客 1万+

基于相位检测与锁相环的DIY超声波风速仪设计与实现

相位检测是信号处理中的一项基础技术,它通过测量两个周期信号之间的相位差来获取信息。其核心原理在于,当信号在介质中传播时,外部因素(如风速)会改变其传播速度,从而导致接收端信号的相位发生偏移。锁相环(PLL)是实现高精度相位检测的关键电路,它能动态调整本地振荡器的频率,以跟踪并锁定输入信号的相位,从而将微小的相位变化转换为易于测量的电压信号。这项技术的工程价值在于其对电路精度要求相对较低,鲁棒性好,非常适合低成本、高灵敏度的测量应用。在气象监测、工业传感和消费电子等领域,相位检测技术被广泛用于风速风向测量、位

weixin_29540599的博客 387

leetcode:70. 爬楼梯

动态规划

OceanStar的博客 3701

CPA-7-资产减值

摘要:本文系统梳理了资产减值会计处理规范,涵盖六大要点:1)不同资产适用的减值准则(存货、长期资产、金融资产);2)减值测试触发条件与例外情形(商誉等需年度强制测试);3)存货可变现净值计算方法及特殊考量;4)可收回金额的双重判定标准(公允价值净额与现值孰高);5)资产组认定标准及减值分摊顺序(先商誉后按比例);6)含少数股东商誉的减值测试方法(需调整包含完全商誉的账面价值)。文中通过具体案例演示了合并报表中商誉减值的计算过程,强调比较基准应包含少数股东权益对应的商誉价值。

qq_34047402的博客 203

基于Simulink的单级式光伏并网系统MPPT控制仿真

本文基于Simulink平台,详细介绍了单级式光伏并网系统的MPPT控制仿真实现。主要内容包括:1)阐述MPPT作为光伏系统"智能大脑"的核心作用;2)解析单级式系统架构及扰动观察法(P&O)算法原理;3)以10kW户用系统为例,分步骤演示建模过程,包括光伏阵列搭建、P&O控制器实现(含MATLAB代码)、并网控制设计等;4)通过仿真验证系统在光照突变下的动态响应性能,MPPT效率达98.3%。文章还提出了变步长P&O等优化方向,为光伏系统仿真与控制提供实用指导。

xiaoheshang_123的博客 111

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

这道题目和动态规划:斐波那契数题目基本是一样的,但是会发现本题相比动态规划:斐波那契数难多了,为什么呢?关键是动态规划:斐波那契数题目描述就已经把动规五部曲里的递归公式和如何初始化都给出来了,剩下几部曲也自然而然的推出来了。而本题,就需要逐个分析了,大家现在应该初步感受出关于动态规划,你该了解这些!里给出的动规五部曲了。简单题是用来掌握方法论的,例如昨天斐波那契的题目够简单了吧,但昨天和今天可以使用一套方法分析出来的,这就是方法论!

Lowjin_的博客 2715

【PointNet++】制作点云数据集使用CloudCompare进行标注

使用PointNet++复现成功后,需要训练自己的数据集。于是使用cloudcompare参照ShapeNet的数据集格式去制作,最终保存的txt文件格式为“xyz+rgb+label”,一共7列。 自己按此制作好的数据集已成功训练及推测,于是记录下来让好兄弟好姐妹们少踩坑多吃肉。

纵马踏花向自由 5713

【Leetcode】70. 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?

gzkyyds的博客 1944

实战落地!Python抓取股票历史数据:开盘/收盘/成交量全维度爬取(附数据清洗+可视化)

股票历史数据抓取的核心是“数据准确性+完整性”,网页爬取适合小批量、个性化需求,API调用适合批量、标准化需求。多市场数据抓取:适配港股(00700.HK)、美股(AAPL)的抓取逻辑;高频数据抓取:抓取分钟级、小时级行情数据,用于短线量化策略;财务数据扩展:抓取市盈率、市净率、净利润等财务指标,结合价格数据做基本面分析;量化策略回测:将清洗后的数据接入Backtrader、VNPY等量化框架,验证策略有效性。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1739

HTOL集成电路老化测试学习总结-20250510

电子元器件的可靠性在产品开发中至关重要,尤其是在微电子技术迅速发展的今天。电子元器件的失效率通常遵循“浴盆曲线”,分为早期失效期、可使用期和老化期。为了评估芯片的可靠性,常采用高温操作寿命测试(HTOL),通过高温和高压加速芯片老化,以筛选出早期失效的芯片并评估其长期可靠性。HTOL测试中,芯片在高温下运行并监控其性能变化,通过阿伦尼乌斯公式计算加速因子,预测芯片的失效率和寿命。此外,Burn-in测试用于加速芯片老化,提前发现并剔除不合格产品,而早期失效率测试(ELFR)则用于评估产品初期使用阶段的可靠性

歌颂苦难的行为是无耻的; 2101

LeetCode 爬楼梯(动态规划)

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数。 示例 1: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1 阶 + 1 阶 2 阶 示例 2: 输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1 阶 + 1 阶 + 1 阶 1 阶 + 2 阶 2 阶 + 1 阶 思路...

hestyle的博客 517

SAP 生产订单归档简介

通常在使用了几年的SAP后,系统中会产生非常多的数据在系统中,特别是制造业的生产订单,常年的累积会存在很多的订单在系统中,这个时候就可以使用归档的功能,对生产订单进行处理。标记DLFL的前提是需要完成生产订单的差异结算,DLFL标记可以清除掉生产订单的相关需求和预留。6、在执行CO78选择删除,前面的操作相当于我们把需要归档的数据写入了数据库中,现在正式进行数据的归档删除。然后我们co03在去看生产订单,可以看到生产订单中多了删除的状态和标记的状态。我这里直接执行的程序PPARCHP1,效果其实是一样的。

我小时候很黑的博客 2284

Leetcode HOT 100 题目总结(已完结)

文章目录前引题目博客链接Easy No.1 - No.21 前引 这段时间感觉动态规划已经做伤了 就是真的没什么动力再做下去了 后面没做的也都是难的不行的dp题目了 想着还是要做的 这段时间换点口味 把力扣HOT 100题给全做了 写个总结 题目博客链接 Easy No.1 - No.21 461. 汉明距离 617. 合并二叉树 104. 二叉树的最大深度 206. 反转链表 169. 多数元素 21. 合并两个有序链表 ...

Love 6's Private Blog 1万+

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

力扣hot100

【代码】力扣hot100。

qq_59768361的博客 1400

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

【Leetcode hot 100】70.爬楼梯

本文介绍了LeetCode爬楼梯问题的三种解法。基础动态规划解法使用dp数组存储每层的方法数,空间复杂度O(n);优化解法通过滚动变量将空间复杂度降至O(1),是面试推荐的最优解;数学公式法利用斐波那契数列通项公式实现O(1)时空复杂度,但存在精度问题。三种方法各具特点,实际应用中建议优先选择空间优化版的动态规划解法。

专注Java和MySQL领域知识分享 932

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

leetcode HOT100总结

本人菜鸡一枚,历时两个月时间把HOT100题做完(Ctrl C-V)了,做完之后还是感觉到很虚,很多中等题还是不会做,于是乎花几天时间把这100题给总结一下。一方面,对自己的知识梳理;另一方面,便于后续回顾。(完成度99,是因为有一道题目收费,没有做!哈哈哈!)以下所有题目都是用Python3实现的。 下面是对这些题目按照算法进行分类整体,主要包括排序、哈希表、递归\回溯、链表、双指针、动态规划、二分查找、贪心、树、深度优先搜索、广度优先搜索等。 在整理之前,先学习一下Python的基本数据类型有哪些,请

qq_36561737的博客 4744

【leetcode hot 100 70】爬楼梯

【代码】【leetcode hot 100 70】爬楼梯。

longii11的博客 1028

力扣hot100——动态规划

hot100中的动态规划

qq_65507629的博客 1185

LeetCode 热题 HOT 100 Java题解——70. 爬楼梯

LeetCode 热题 HOT 100 Java题解70. 爬楼梯动态规划复杂度分析 70. 爬楼梯 题目: 假设你正在爬楼梯。需要 n 阶你才能到达楼顶。 每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢? 注意: 给定 n 是一个正整数。 示例: 输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶 动态规划 当前第iii个台阶的跳法要么是第i−2i-2i−2个台阶以下跳2个台阶跳过来,要么就是第i−1i-1i−1个台阶跳一步跳过来,

qq_20067165的博客 249

最详细,最简单的力扣(leetcode)hot 100 动态规划(上)篇讲解

本期带来的是力扣 hot 100里面关于动态规划内容。希望本篇博客能帮助到正在学历力扣 hot 100的你

yyyCode的博客 1109

LeetCode Hot100(动态规划)

我们直接可以手动模拟,设置dpi是当前位置是否能够被拼接成功,那么我们每一次枚举到一个位置,就去枚举所有的字串,如果当前的字串能够完全的匹配i和i-length+1的字串,就去看看i-length是否可以,如果可以当前位置也就可以了。我们由于只能分成两个集合,那么两个集合的和明显是总的和/2 ,记录总和为sum,每个数组的和也就是sum/2,又发现,每个元素只能拿一个,那我们如果能够抽起来sum/2就可以了,去跑一便01背包。不要求字典中出现的单词全部都使用,并且字典中的单词可以重复使用。

asom12的博客 1326

力扣hot100二刷——动态规划

第二次刷题不在idea写代码,而是直接在leetcode网站上写,“逼”自己掌握常用的函数。

weixin_49426115的博客 973

LeetCode Hot100题解

链表的多数问题可以通过双指针(快慢指针、前后指针)高效解决。

2301_82023822的博客 2668

leetcode hot100 动态规划

hot100中动态规划相关题目

m0_49860814的博客 1061

leetcode hot100普通动态规划/基础DP

从s头遍历到尾部, 遍历到i时, 如果0~i存在一个j使得s[0,j]在字典中且s[j,i]在字典中, 那么说明s[0,i]在字典中,即dp[i]=true,那么此处就存在一个DP,每次步入一个新的i,判断其中是否存在j使得上述成立, 直至i=s.length()如果出现负数, 那么前一位的最大值会变成最小值, 前一位的最小值会变成最大值, 那么当前的最大值=Math.max(前面的最大值*当前值,当前值),当前的最小值=Math.min(前面的最小值*当前值, 当前值)

weixin_74191696的博客 1244
上一篇: LeetCode Hot100(63/100)——31. 下一个排列
下一篇: LeetCode Hot100(65/100)——64. 最小路径和
TracyCoder123
博客等级 码龄8年 1万+粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值