70. 爬楼梯
创始人
2025-05-31 15:31:30
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)

相关内容

热门资讯

“男子持刀入室盗窃”视频引发关... 近日,一段疑似“小偷”入室盗窃被业主家中监控拍下的视频在网上引发关注。11月21日晚,“翠屏公安”微...
绝不允许日本军国主义幽灵复活!... 2025年11月7日,日本首相高市早苗宣称,如果中国大陆对台湾出动军舰并使用武力,可能会构成“存亡危...
【解决】AI法律助手荣获202... 2025全球数字经济大会启幕,搭建国际数字合作高端平台 经国务院批准,由北京市人民政府、国家互联网信...
嘉兴男子与妻争吵,突然将行李箱... 近日,浙江嘉兴一对夫妻因琐事发生争吵,丈夫突然将装满衣物的行李箱从6楼扔到楼下,引发关注。11月22...
三地107家律所齐聚丰台,京津... 11月22日,京津冀律师驿站举办“党建业务深度融合 促进行业规范发展”主题活动,发布“百千万行动计划...
家装预付资金安全困局如何破解,... 家装预付资金安全困局如何破解 专家提出:建立“先验收后付款”装修资金存管制度 预交数万元甚至数十万元...
工行安康解放路支行积极开展《反... 为深入贯彻落实《国家金融监督管理总局安康监管分局办公室关于开展<反有组织犯罪法>宣传活动的通知》要求...
重庆公布育儿补贴制度实施方案 原标题:每孩每年3600元 重庆公布育儿补贴制度实施方案 11月21日,记者了解到,市卫生健康委、市...
十五运会组委会在深总结本届赛事... 深圳新闻网2025年11月22日讯(深圳报业集团记者 林炜航)11月21日,十五运会组委会在深圳市民...