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

LeetCode 70. Climbing Stairs 题解

LeetCode 70. Climbing Stairs 题解

题目描述

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

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

示例 1:

输入:n = 2 输出:2 解释:有两种方法可以爬到楼顶。 1. 1 阶 + 1 阶 2. 2 阶

示例 2:

输入:n = 3 输出:3 解释:有三种方法可以爬到楼顶。 1. 1 阶 + 1 阶 + 1 阶 2. 1 阶 + 2 阶 3. 2 阶 + 1 阶

解题思路

方法一:动态规划

思路

  • 定义dp[i]为爬到第i阶的不同方法数
  • 状态转移方程:dp[i] = dp[i-1] + dp[i-2],因为爬到第i阶的方法数等于爬到第i-1阶的方法数加上爬到第i-2阶的方法数
  • 初始化:dp[1] = 1dp[2] = 2
  • 遍历计算dp[3]dp[n]

复杂度分析

  • 时间复杂度:O(n),其中 n 是台阶数。需要遍历计算dp[3]dp[n]
  • 空间复杂度:O(n),需要一个长度为 n+1 的数组来存储状态。

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

思路

  • 观察到dp[i]只依赖于dp[i-1]dp[i-2],因此可以使用两个变量来存储前两个状态,而不需要使用数组
  • 初始化:prev = 1(表示dp[1]),curr = 2(表示dp[2]
  • 遍历计算dp[3]dp[n],每次更新prevcurr的值

复杂度分析

  • 时间复杂度:O(n),其中 n 是台阶数。需要遍历计算dp[3]dp[n]
  • 空间复杂度:O(1),只需要常数级的额外空间。

方法三:矩阵快速幂

思路

  • 递推关系dp[i] = dp[i-1] + dp[i-2]可以表示为矩阵形式:

    [dp[i] ] = [1 1] * [dp[i-1]] [dp[i-1]] [1 0] [dp[i-2]]
  • 因此,我们可以使用矩阵快速幂来加速计算,将时间复杂度降低到 O(log n)

复杂度分析

  • 时间复杂度:O(log n),其中 n 是台阶数。矩阵快速幂的时间复杂度是 O(log n)。
  • 空间复杂度:O(1),只需要常数级的额外空间。

代码实现

方法一:动态规划

class Solution: def climbStairs(self, n: int) -> int: if n == 1: return 1 if n == 2: return 2 dp = [0] * (n + 1) dp[1] = 1 dp[2] = 2 for i in range(3, n + 1): dp[i] = dp[i-1] + dp[i-2] return dp[n]

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

class Solution: def climbStairs(self, n: int) -> int: if n == 1: return 1 if n == 2: return 2 prev = 1 # dp[1] curr = 2 # dp[2] for i in range(3, n + 1): next_val = prev + curr prev = curr curr = next_val return curr

方法三:矩阵快速幂

class Solution: def climbStairs(self, n: int) -> int: if n == 1: return 1 if n == 2: return 2 # 定义矩阵乘法 def multiply(a, b): return [ [a[0][0] * b[0][0] + a[0][1] * b[1][0], a[0][0] * b[0][1] + a[0][1] * b[1][1]], [a[1][0] * b[0][0] + a[1][1] * b[1][0], a[1][0] * b[0][1] + a[1][1] * b[1][1]] ] # 定义矩阵快速幂 def matrix_pow(matrix, power): result = [[1, 0], [0, 1]] # 单位矩阵 while power > 0: if power % 2 == 1: result = multiply(result, matrix) matrix = multiply(matrix, matrix) power //= 2 return result # 初始矩阵 matrix = [[1, 1], [1, 0]] # 计算 matrix^(n-2) matrix_n = matrix_pow(matrix, n - 2) # 结果为 matrix^(n-2) * [2, 1]^T return matrix_n[0][0] * 2 + matrix_n[0][1] * 1

测试用例

测试用例 1:

输入:n = 2
输出:2

测试用例 2:

输入:n = 3
输出:3

测试用例 3:

输入:n = 4
输出:5

测试用例 4:

输入:n = 5
输出:8

总结

本题是动态规划的经典问题,主要考察对状态定义和状态转移方程的理解。三种方法各有特点:

  • 动态规划:代码简洁易懂,逻辑清晰,是最直观的解决方案。
  • 动态规划(空间优化):在动态规划的基础上优化了空间复杂度,适用于 n 较大的情况。
  • 矩阵快速幂:将时间复杂度降低到 O(log n),适用于 n 非常大的情况。

在实际应用中,对于一般的 n,动态规划(空间优化)方法通常是最佳选择,因为它既保持了代码的简洁性,又具有较高的效率。

无论使用哪种方法,核心思想都是相同的:利用递推关系dp[i] = dp[i-1] + dp[i-2]来计算爬到第 n 阶的不同方法数。

http://www.jsqmd.com/news/559496/

相关文章:

  • 从源码编译到放弃?DataEase源码部署踩坑实录(Node.js版本冲突解决指南)
  • 南京高端腕表寄修全流程:2026 六城标准、30 + 品牌操作与安全保障指南 - 时光修表匠
  • SOONet模型Matlab接口调用与数据分析可视化
  • 应急响应实战:从Vulntarget靶场看XXL-JOB被黑后的数据库取证与攻击链还原
  • 通义千问3-Reranker-0.6B开源贡献:社区开发与模型优化指南
  • OpenClaw儿童模式:基于百川2-13B打造家长控制的作业辅导助手
  • Z-Image-Turbo极速创作室:打造个人专属AI艺术画廊的简单方法
  • 双瑞机械的聚苯醚PPO设备口碑如何,值得选购吗? - 工业设备
  • 精通XUnity.AutoTranslator:突破Unity游戏语言障碍的终极解决方案
  • 从零开始掌握MZmine 3:质谱数据分析的5个实用技巧
  • MZmine 3质谱数据分析实战手册:从数据导入到生物学洞察的完整指南
  • RexUniNLU硬件加速:TensorRT推理优化实践
  • 别再乱用lv_scr_load了!LVGL Screen与Layer的正确打开方式:实现流畅的页面切换动画
  • 告别B站视频下载难题:BilibiliDown全攻略
  • 零门槛玩转Notepad--:提升300%效率的新手友好实战指南
  • Downr1n iOS降级与越狱实战指南:从问题诊断到解决方案
  • 学习助手搭建:OpenClaw+GLM-4.7-Flash自动生成复习题
  • 中国上市公司借款数据全景解析:从长期到短期的资金流动
  • 面向对象设计必知:6种类关系在酒店管理系统中的实际应用
  • 2026年无锡热门的Li2S设备精选推荐,靠谱的硫化锂Li2S设备厂家有哪些 - 工业推荐榜
  • 不只是编译:在Ubuntu 20.04下为QGC 4.4配置Qt 5.15+GStreamer 1.16的完整开发环境指南
  • Android FRP分区与OEM解锁:从开发者选项到硬件抽象层的安全联动
  • USB PD 3.1深度解析:如何实现240W高功率供电(附时序图详解)
  • SeqGPT-560M效果可视化展示:同一段财经新闻,多标签分类与字段抽取结果集
  • 聊聊2026年聚苯醚设备PPO设备性价比,无锡双瑞机械值得关注 - mypinpai
  • 【FastAPI 2.0流式AI响应终极指南】:5大异步陷阱+3层缓冲优化+实测QPS提升270%
  • 2026年好用的Li2S设备推荐,分析Li2S设备人气排行 - mypinpai
  • 说说硫化锂Li2S设备选购要点,无锡双瑞机械值得推荐吗 - myqiye
  • 基于python框架的创意方案评选平台发布的设计与实现vue
  • 5分钟掌握League Akari:英雄联盟终极智能助手完全指南