其他分享
首页 > 其他分享> > Leetcode Hot 100 Problems —— 70. 爬楼梯问题

Leetcode Hot 100 Problems —— 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