1. 程式人生 > >leetcode 70. 爬樓梯

leetcode 70. 爬樓梯

題目描述:

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

每次你可以爬 1 或 2 個臺階。你有多少種不同的方法可以爬到樓頂呢?

思路:

之前看斐波那契數列相關東西時,聽說過這個...所以瞬間想到。第n階臺階,要麼是從n-1階跨一步上來的,要麼是從n-2階跨兩步上來的。所以f(n)=f(n-1)+f(n-2)。但是遞迴時間複雜度太高,要改成迴圈。不如用陣列a[n]儲存所有的中間資料。

int climbStairs(int n) {
        if(n<3) return n;

        int a[n]{0};
        a[0]=1,a[1]=2;
        for(int i=2;i<n;i++)
            a[i]=a[i-1]+a[i-2];
        return a[n-1];
    }

時間複雜度為O(n),空間複雜度也是O(n)。

注意到a[i]只與a[i-1] 、a[i-2] 相關,空間可以進一步優化。

int climbStairs(int n) {
        if(n<3) return n;
        int a=1,b=2;
        while(n-->2)
        {
            b=a+b;
            a=b-a;
        }
        return b;
    }

時間複雜度為O(n),空間複雜度為O(1)

不過測試執行時間從優化前的0ms增加到了8ms。