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

LeetCode 96 Unique Binary Search Trees:卡特蘭數與動態規劃

     編輯:關於C++

題目回顧

給定 n,求由 1...n 構成的結構不同的二叉搜索樹(BST)數量。
例:n=3 → 5 棵不同結構的 BST。

核心遞推:卡特蘭數

以 i (1≤i≤n) 為根,左子樹由 [1, i-1] 構成,右子樹由 [i+1, n] 構成。
設 f(k) 為 k 個節點的不同 BST 數,則:

f(0) = 1 (空樹)
f(1) = 1
f(2) = f(0)f(1) + f(1)f(0) = 2
f(3) = f(0)f(2) + f(1)f(1) + f(2)f(0) = 5
...
f(n) = Σ f(i-1) * f(n-i)  (i=1..n)

這正是卡特蘭數:C_n = (2n)! / ((n+1)! n!)

動態規劃實現

class Solution {
public:
    int numTrees(int n) {
        vector dp(n + 1, 0);
        dp[0] = 1;
        dp[1] = 1;
        for (int i = 2; i <= n; ++i) {
            for (int k = 1; k <= i; ++k) {
                dp[i] += dp[k - 1] * dp[i - k];
            }
        }
        return dp[n];
    }
};

數學公式 O(n) 計算(防溢出用長整型)

class Solution {
public:
    int numTrees(int n) {
        long long catalan = 1;
        for (int i = 0; i < n; ++i) {
            catalan = catalan * 2 * (2 * i + 1) / (i + 2); // C_{i+1} = C_i * 2(2i+1)/(i+2)
        }
        return (int)catalan;
    }
};

複雜度

方法時間空間備註
DP 遞推O(n²)O(n)通用、易理解
卡特蘭公式O(n)O(1)需防溢出、面試加分

圖解 n=3 的 5 棵 BST

n=3 的 5 種 BST 結構

延伸:LeetCode 95 生成所有 BST

若需生成所有結構,需遞歸構建左右子樹列表並組合,時間空間均為卡特蘭數級別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved