ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-03-26 12:33:47  阅读:210  来源: 互联网

标签:already return 递归 int 复杂度 Problems climbstair Hot 70


爬楼梯

题目链接在这里!

简单描述:

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

递归解法

递归公式:

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

直接递归

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

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. 使用数组存储:
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存储
#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)!但空间复杂度略高。

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

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

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;
}

标签:already,return,递归,int,复杂度,Problems,climbstair,Hot,70
来源: https://www.cnblogs.com/ymj68520/p/16058354.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有