假設你正在爬樓梯。須要 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); } };