LeetCode 70 - 爬樓梯 - [遞推+滾動優化]

假設你正在爬樓梯。須要 n 階你才能到達樓頂。優化

每次你能夠爬 1 或 2 個臺階。你有多少種不一樣的方法能夠爬到樓頂呢?spa

注意:給定 n 是一個正整數。code

示例 1:blog

輸入: 2
輸出: 2
解釋: 有兩種方法能夠爬到樓頂。
1. 1 階 + 1 階
2. 2 階io

示例 2:class

輸入: 3
輸出: 3
解釋: 有三種方法能夠爬到樓頂。
1. 1 階 + 1 階 + 1 階
2. 1 階 + 2 階
3. 2 階 + 1 階變量

 

設 $f[n]$ 表示跳上 $n$ 級臺階的方案數目,所以很容易獲得 $f[n] = f[n-1] + f[n-2]$,這就是一個斐波那契數列。cli

咱們能夠用遞推的方法 $O(n)$ 求出斐波那契數列求出第 $n$ 項,而後因爲每次遞推只涉及到三個變量,因此咱們用滾動優化的方式使得空間複雜度變成 $O(1)$。方法

 

AC代碼:im

class Solution
{
public:
    int climbStairs(int n)
    {
        if(n<=3) return n;
        int a[3]={1,1,2};
        for(int i=3;i<=n;i++) a[i%3]=a[(i+1)%3]+a[(i+2)%3];
        return a[n%3];
    }
};

 

固然,咱們知道斐波那契數列是由通項公式的,咱們能夠用通項公式 $O(1)$ 地求第 $n$ 項,固然須要注意一下double類型轉成int類型時候的一些精度上的小問題。

 

AC代碼:

inline int fibo(int n)
{
    double res=1.0/sqrt(5);
    res*=pow((1.0+sqrt(5))/2.0,n)-pow((1.0-sqrt(5))/2.0,n);
    return (int)(res+1e-10);
}

class Solution
{
public:
    int climbStairs(int n)
    {
        return fibo(n+1);
    }
};
相關文章
相關標籤/搜索