首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

LeetCode 爬樓梯:費波那契數列的動態規劃與矩陣快速冪解法

     編輯:關於C++

問題與遞推

每步可爬 1 或 2 階,求爬 n 階的方法數。
f(n) = f(n-1) + f(n-2),f(1)=1, f(2)=2。即費波那契數列後移一位。

O(n) 迭代法(滾動變量)


int climbStairs(int n) {
    int a = 0, b = 1; // f(0)=0, f(1)=1
    for (int i = 1; i <= n; ++i) {
        int c = a + b;
        a = b; b = c;
    }
    return b;
}

O(log n) 矩陣快速冪

[f(n), f(n-1)]^T = M^(n-1) * [f(1), f(0)]^T,
M = [[1,1],[1,0]]。用二進制快速冪計算 M^(n-1)。

通項公式(Binet 公式,雙精度誤差風險)

f(n) = round(φ^n / √5),φ = (1+√5)/2。n ≤ 45 時 double 精度足夠。

擴展:k 步爬樓梯

若每步可爬 1..k 階,則 f(n) = sum_{i=1..k} f(n-i),用滑動窗口 O(n) 或矩陣 O(k^3 log n) 求解。

複雜度總結

方法時間空間備註
遞歸 + 備忘錄O(n)O(n)棧溢出風險
迭代滾動O(n)O(1)推薦
矩陣快速冪O(log n)O(1)大 n 優勢
通項公式O(1)O(1)精度限制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved