Medium草稿★★★★★O(n) 時間 · O(1) 空間
TreeBSTDPCatalan Number
Patterns🌳 樹形 DFS🧮 數學・組合
尚未複習過

解法已隱藏 — 先讀題目敘述、自己想想看,再點上方按鈕揭曉。

96Unique Binary Search TreesTreesMediumTrees

給定整數 n,回傳由 1 到 n 組成的所有結構不同的 BST 數量。

Example:

Input: n = 3 Output: 5

Intuition

TIP

選定根節點後,左右子樹的組合數相乘;遍歷所有可能的根就是卡塔蘭數。

Approaches

1. DP — O(n^2) / O(n)
  • Idea: 自底向上計算 G(0) 到 G(n),G(n) = sum(G(i-1) * G(n-i))
  • Time: O(n^2)
  • Space: O(n)
class Solution {
    fun numTrees(n: Int): Int {
        val dp = IntArray(n + 1)
        dp[0] = 1
        dp[1] = 1
        for (i in 2..n) {
            for (j in 1..i) {
                dp[i] += dp[j - 1] * dp[i - j]
            }
        }
        return dp[n]
    }
}
⭐ 2. Catalan Number Formula — O(n) / O(1)
  • Idea: 直接用卡塔蘭數的遞推公式 C(n) = C(n-1) * 2(2n-1) / (n+1)
  • Time: O(n)
  • Space: O(1)
class Solution {
    fun numTrees(n: Int): Int {
        var catalan = 1L
        for (i in 1 until n) {
            catalan = catalan * 2 * (2 * i + 1) / (i + 2)
        }
        return catalan.toInt()
    }
}
Catalan Number Application

卡塔蘭數 C(n) 出現在很多組合問題中:

  • n 個節點的不同 BST 結構數
  • n 對括號的合法組合數
  • n+1 個矩陣連乘的不同括號化方式
  • 從 (0,0) 到 (n,n) 不越過對角線的路徑數

🔑 Takeaways