70. Climbing Stairs

題目描述:給正整數 n 表示樓梯級數,每次能邁一層或者兩層,問一共有多少種登頂法。

分析:基礎的常見題,兩種思路三種做法。到達第 n 級臺階的方法為 n - 1 級登一步,或n - 2 級登兩步。遞歸或迭代,遞歸肯定要超時,迭代時間復雜度O(n),空間O(1)。第三種數學法,這個規律實際上是斐波那契數列的遞推式,可以用斐波那契通項公式:

迭代法:時間復雜度O(n),空間O(1)。

class Solution {
public:
    int climbStairs(int n) {
        if (n == 1 || n == 0) return 1;
        int a = 0, b = 1;
        for (int i = 1; i <= n; i ++)
        {
            int t = b;
            b += a;
            a = t;
        }
        return b;
    }
};

迭代法二:時間復雜度O(n),空間O(n)

class Solution {
public:
    int climbStairs(int n) {
        vector<int> f(n + 1, 0);
        f[0] = 1;
        f[1] = 2;
        for (int i = 2; i <= n; i++) 
            f[i] = f[i - 1] + f[i - 2];

        return f[n];
    }
};

記憶化搜索:

#include <iostream>
#include <algorithm>
#include <string>
#include <sstream>
using namespace std;
int f[100];
int fun(int x)
{
    if (x == 1 || x == 0) return 1;
    if (f[x] != 0) return f[x];
    f[x] = fun(x - 1) + fun(x - 2);
    return f[x];
}
int main()
{
    f[0] = 1;
    f[1] = 1;
    cout<< fun(10)<<endl;
    return 0;
}

斐波那契公式:時間復雜度O(1),空間O(1)。

class Solution {
public:
    int climbStairs(int n) {
        double x = sqrt(5);
        return floor( ( pow( (1 + x) / 2, n + 1) + pow( (1 - x) / 2, n + 1) ) / x + 0.5 );
    }
};
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容