news 2026/10/16 3:07:27

【动态规划-22】70.爬楼梯

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【动态规划-22】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 阶

解题思路:

方法一:动态规划

核心思路:

状态定义:

dp[i]= 爬到第i阶的方法数。

状态转移:

要到达第i阶,可以从:

  • 第i-1阶爬 1 阶上来

  • 第i-2阶爬 2 阶上来

dp[i] = dp[i-1] + dp[i-2]
初始化:
  • dp[0] = 1(地面,1 种方法)

  • dp[1] = 1(爬 1 阶,1 种方法)

具体过程示例:

n = 5

idp[i]
01
11
22
33
45
58

结果:8✅

代码实现:

写法1:数组 DP
class Solution { public: int climbStairs(int n) { if (n <= 1) return 1; vector<int> dp(n + 1, 0); dp[0] = 1; dp[1] = 1; for (int i = 2; i <= n; i++) { dp[i] = dp[i-1] + dp[i-2]; } return dp[n]; } };
写法2:滚动变量(空间优化)
class Solution { public: int climbStairs(int n) { if (n <= 1) return 1; int prev2 = 1; // dp[0] int prev1 = 1; // dp[1] for (int i = 2; i <= n; i++) { int curr = prev1 + prev2; prev2 = prev1; prev1 = curr; } return prev1; } };
写法3:通项公式(斐波那契)
class Solution { public: int climbStairs(int n) { double sqrt5 = sqrt(5); double fib = pow((1 + sqrt5) / 2, n + 1) - pow((1 - sqrt5) / 2, n + 1); return round(fib / sqrt5); } };

注意:浮点数精度问题,n 很大时可能出错。

复杂度分析:

方法时间复杂度空间复杂度
数组 DPO(n)O(n)
滚动变量O(n)O(1)
通项公式O(log n)O(1)

关键细节:

1. 为什么是斐波那契数列?

dp[i] = dp[i-1] + dp[i-2]正是斐波那契的递推公式。

  • dp[1] = 1

  • dp[2] = 2

  • dp[3] = 3

  • dp[4] = 5

  • dp[5] = 8

2. 为什么dp[0] = 1?

地面可以看作"爬 0 阶",有 1 种方法(什么都不做)。

3. 和「斐波那契数」的区别
题目区别
509. 斐波那契数F(0)=0, F(1)=1
70. 爬楼梯dp[0]=1, dp[1]=1

本质一样,只是初始值不同。

4. 如果每次可以爬 1、2、3 阶呢?

dp[i] = dp[i-1] + dp[i-2] + dp[i-3],类似「三步问题」。

方法二:递归 + 记忆化

代码实现:

class Solution { public: int climbStairs(int n) { vector<int> memo(n + 1, -1); return dfs(n, memo); } private: int dfs(int n, vector<int>& memo) { if (n <= 1) return 1; if (memo[n] != -1) return memo[n]; memo[n] = dfs(n - 1, memo) + dfs(n - 2, memo); return memo[n]; } };

复杂度:时间 O(n),空间 O(n)

方法三:矩阵快速幂(O(log n))

代码实现:

class Solution { public: int climbStairs(int n) { if (n <= 1) return 1; vector<vector<long long>> M = {{1, 1}, {1, 0}}; vector<vector<long long>> result = matrixPow(M, n); return result[0][0]; } private: vector<vector<long long>> matrixPow(vector<vector<long long>>& M, int n) { vector<vector<long long>> result = {{1, 0}, {0, 1}}; vector<vector<long long>> base = M; while (n > 0) { if (n & 1) result = multiply(result, base); base = multiply(base, base); n >>= 1; } return result; } vector<vector<long long>> multiply(vector<vector<long long>>& A, vector<vector<long long>>& B) { vector<vector<long long>> C(2, vector<long long>(2, 0)); for (int i = 0; i < 2; i++) { for (int j = 0; j < 2; j++) { for (int k = 0; k < 2; k++) { C[i][j] += A[i][k] * B[k][j]; } } } return C; } };

复杂度:时间 O(log n),空间 O(1)

四种方法对比:

方法时间复杂度空间复杂度推荐度
滚动变量 DPO(n)O(1)⭐⭐⭐⭐⭐
数组 DPO(n)O(n)⭐⭐⭐⭐
矩阵快速幂O(log n)O(1)⭐⭐⭐
通项公式O(log n)O(1)⭐⭐

总结:

要点说明
核心思想dp[i] = dp[i-1] + dp[i-2]
初始化dp[0] = 1,dp[1] = 1
时间复杂度O(n)
空间复杂度O(1)(滚动变量)
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/16 3:07:24

说一句话镜头就换装:实时 AI 虚拟试衣智能体快速上手

说一句话镜头就换装&#xff1a;实时 AI 虚拟试衣智能体快速上手 【免费下载链接】Vision-Agents Open Vision Agents by Stream. Build voice and vision agents quickly with any model or video provider. Uses Streams edge network for ultra-low latency. 项目地址: ht…

作者头像 李华
网站建设 2026/10/16 3:07:23

Halcon 3D 点云处理(3D Object Model)详解与算子说明

Halcon 3D 点云处理(3D Object Model)详解与算子说明 参考来源:Halcon 17.12 Operator Reference — 3D Object Model 章节、Solution Guide III-C (3D Vision) 适用版本:Halcon 17.12(主基准)/ 20.11 / 22.11 / 24.05 官方示例路径:Applications/3d_models/、examples/…

作者头像 李华
网站建设 2026/10/16 3:06:19

Redis 事务为什么没回滚:MULTI 的 3 个反直觉行为

我不会起名字322 后端 / 算法 / 数据库 &#x1f4d8; 技术栈 &#xff5c; &#x1f9e9; 力扣 Hot100 &#xff5c; &#x1f439; Go 项目 &#xff5c; &#x1f7e5; Redis &#xff5c; &#x1f42c; MySQL 文章目录Redis 事务为什么没回滚&#xff1a;MULTI 的 3 个反…

作者头像 李华
网站建设 2026/10/16 3:05:19

LangChain 上线部署:把链和 Agent 变成能对外服务的 API

个人主页&#xff1a;> for_ever_love__ <&#xff08;欢迎各位大佬莅临&#x1f60a;&#xff09; 其他栏目: > 大模型开发从0到1 < 其他栏目: > iOS项目总结大全 < 其他栏目: > 我想学python了 < 其他栏目: > iOS UI < 文章目录LangChain 上线…

作者头像 李华
网站建设 2026/10/16 3:05:09

如何安装任意版本docker

Docker 是一个基于容器技术的开源平台&#xff0c;旨在通过容器化简化应用的开发、部署和运行。其核心理念是“Build once, Run anywhere”&#xff08;构建一次&#xff0c;到处运行&#xff09;&#xff0c;将应用程序及其依赖项打包到轻量级、可移植的容器中&#xff0c;确保…

作者头像 李华