すのはら荘春原庄的雪

目录

  1. 爬楼梯
    1. 递归解法#
      1. 直接递归#
      2. 存储中间结果的递归法#
    2. 使用非递归法——迭代累加#

Leetcode Hot 100 Problems —— 70. 爬楼梯问题

Toretto·2022-03-26 12:18·35 次阅读

Leetcode Hot 100 Problems —— 70. 爬楼梯问题

爬楼梯

题目链接在这里!

简单描述:

现在有n阶楼梯,每次只能爬一阶或者两阶,
问:一共有多少种走法?

递归解法#

递归公式:

Copy
highlighter-hljs
f(n)={
1, n=1
2, n=2
f(n-1)+f(n-2), n>3
}

直接递归#

比较好理解,将递归公式翻译就行。代码如下:

Copy
highlighter-hljs
int climbstair_digui(int n){
if(n==1 || n==2)
return n;
return climbstair_digui(n-1)+climbstair_digui(n-2);
}

高复杂度,时间复杂度O(n^2)
重复计算,因为每一次分支递归都有可能计算前面计算过的!
比如:f6 = f5 + f4, f5 = f4 + f3, f4 = f3 + f2...
解决办法,存储计算结果,以空间换时间。

存储中间结果的递归法#

  1. 使用数组存储:
Copy
highlighter-hljs
int already[100010] = {0};
int climbstair_ar(int n){
if(n==1 || n==2)
return n;
if(0 != already[n])
return already[n];
already[n] = climbstair_ar(n-1)+climbstair_ar(n-2);
return already[n];
}
  1. 使用map存储
Copy
highlighter-hljs
#include <map>
map<int,int> almap;
int climbstair_mp(int n){
if(n==1||n==2)
return n;
if(0 != almap.count(n))
return almap[n];
int result = climbstair_mp(n-1)+climbstair_mp(n-2);
almap[n] = result;
return result;
}

以上两种解法时间复杂度约为O(n)!但空间复杂度略高。

使用非递归法——迭代累加#

自低向下,由已知累加。
使用两个单独的变量,存储两个可能的累加值
时间复杂度更低,空间复杂度更低!

Copy
highlighter-hljs
int climbstair(int n){
if(n==1||n==2)
return n;
int result = 0;
int pre=2;
int prepre=1;
for(int i=3;i<=n;i++){
result = pre + prepre;
prepre = pre;
pre = result;
}
return result;
}


作者:Mengjie Ye
出处:https://ymj68520.cnblogs.com/

如果,您希望更容易地发现我的新文章,不妨点击一下绿色通道的关注我

如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!
版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请            .
posted @   ymj68520  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
分享到:
目录

打赏

>>

欢迎打赏支持我 ^_^

扫描二维码打赏

了解更多

点击右上角即可分享
微信分享提示