70:爬楼梯
创始人
2025-05-31 04:01:37
0

70: 爬楼梯

总结

easy题。

题目形成的数列正好是斐波那契数列,答案要求的f(n)f(n)f(n)即是斐波拉契数列的第n项(下标从0开始),本题可按照求解斐波拉契第n项的求解方法。

  • n 比较小的时候,可以直接使用过递归法求解,不做任何记忆化操作,时间复杂度是O(2n)O(2^n)O(2n),存在很多冗余计算。
  • 一般情况下,使用「记忆化搜索」或者「迭代」的方法,实现这个转移方程,时间复杂度和空间复杂度都可以做到O(n)O(n)O(n)。
  • 为了优化空间复杂度,可以不用保存 f(x−2)f(x−2)f(x−2) 之前的项,只用三个变量来维护 f(x)、f(x−1)f(x)、f(x−1)f(x)、f(x−1) 和 f(x−2)f(x−2)f(x−2),可以理解成是把「滚动数组思想」应用在了动态规划中,也可以理解成是一种递推,这样把空间复杂度优化到了O(1)O(1)O(1)。
  • 随着 n 的不断增大 O(n)O(n)O(n) 可能已经不能满足我们的需要了,我们可以用「矩阵快速幂」的方法把算法加速到O(logn)O(logn)O(logn)。
  • 也可以把 n 代入斐波那契数列的通项公式计算结果,但是如果我们用浮点数计算来实现,可能会产生精度误差。

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

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

说明:给定n是一个正整数。

示例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

进阶:

  • 如何用斐波拉契数列的通项公式或矩阵快速幂来解题?

方法一:递推

思路与算法

题目分析:

- 第1级台阶:1种方法(爬1级)
- 第2级台阶:2种方法(爬1级或爬两级)
- 第3级台阶:3种方法(第1级+第2级)
- 第n级台阶:从第n-1级台阶爬1级或从第n-2级台阶爬2级

——递推公式:Fn=Fn−1+Fn−2F_n=F_{n-1}+F_{n-2}Fn​=Fn−1​+Fn−2​

class Solution {
public:int climbStairs(int n) {if(n==1)return 1;if(n==2)return 2;else return climbStairs(n-1)+climbStairs(n-2);}
};
复杂度分析
  • 时间复杂度:O(2n)O(2^n)O(2n)
  • 空间复杂度:O(n)O(n)O(n)

方法二:记忆化递归

思路与算法

减少时间复杂度,避免重复计算

用meno[]数组来记忆每次计算的结果,存储中间结果

class Solution {
public:int climbStairs(int n) {//存储中间结果,避免重复计算int *memo=new int[n+1];return climbStairsMemo(n,memo);}int climbStairsMemo(int n,int memo[]){//判断爬到n级方法是否计算过,若计算过直接返回memo[n]的值if(memo[n]>0){return memo[n];}if(n==1){memo[n]=1;}else if(n==2){memo[n]=2;}else{memo[n]=climbStairsMemo(n-1,memo)+climbStairsMemo(n-2,memo);}return memo[n];}
};
复杂度分析
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(n)O(n)O(n)

方法三:动态规划

思路与算法

爬到每一级的方法看作一个状态,用dp[]数组记录状态,从1-n依次更新每个状态。

虽然在动态规划算法中记录了全部n个状态,但只有两个状态在更新下一个状态的时候才被用到;若只记录这两个状态,就可以将空间复杂度从O(n)O(n)O(n)优化到O(1)O(1)O(1)。

class Solution {
public:int climbStairs(int n) {if(n==1){return 1;} //dp[]记录n个状态int *dp=new int[n+1];dp[1]=1;dp[2]=2;//从1-n依次更新for(int i=3;i<=n;i++){dp[i]=dp[i-1]+dp[i-2];}return dp[n]; }
};
复杂度分析
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(n)O(n)O(n)

方法四:斐波拉契数列

思路与算法

将爬楼梯问题转换成斐波拉契数列问题。

用滚动数组记录n-1和n-2两个状态

每次状态更新之后,先把状态2移动到状态1的位置,再把状态3移动到状态2的位置,把状态整体向前滚动一位,

class Solution {
public:int climbStairs(int n) {if(n==1){return 1;} int first=1;int second=2;for(int i=3;i<=n;i++){int third=first+second;//滚动数组first=second;second=third;}return second; }
} ; 
复杂度分析
  • 时间复杂度:O(n)O(n)O(n)
  • 空间复杂度:O(1)O(1)O(1)

相关内容

热门资讯

AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWR报告解读 WORKLOAD REPOSITORY PDB report (PDB snapshots) AW...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
群晖外网访问终极解决方法:IP... 写在前面的话 受够了群晖的quickconnet的小水管了,急需一个新的解决方法&#x...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
Azure构建流程(Power... 这可能是由于配置错误导致的问题。请检查构建流程任务中的“发布构建制品”步骤,确保正确配置了“Arti...