LeetCode 每日一題 96. 不同的二叉搜尋樹
題目描述
給定一個整數 n,求以 1 ... n 為節點組成的二叉搜尋樹有多少種?
示例:
輸入: 3
輸出: 5
解釋:
給定 n = 3, 一共有 5 種不同結構的二叉搜尋樹:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
Solution
設答案為 \(G(n)\) ,顯然有 \(G(n) = \Sigma _{i=1} ^n G(i-1)*G(n-i)\)
引入卡特蘭數Catalan number,其定義式 \(Catalan_n=\Sigma_{1} ^{n-1} Catalan_i * Catalan_{n-i}\)
令生成函式 \(g(x) = h_1 x + h_2 x^2 + h_3 x^3 + ... + h_n x^n\) (h_i 即 Catalan_i)
\[[g(x)]^2 = h_1^2x^2 + (h_1 h_2 + h_2 h_1)x^3 + (h_1 h_3 + h_2 h_2 + h_3 h1) x^4 + ... + (h_1 h_{n-1} + h_2 h_{n-2} + ... +h_{n-1} h_1)x^n + ... \]
代入 \(h_1 = h_2 = 1\) ,(卡特蘭數定義式有 \(h_n = \Sigma_{1}^{n-1}h_i * h_{n-i}\))
\[\begin{align*} [g(x)]^2 = h_2^2x^2 +h_3 x^3 + h_4 x^4 + ... + h_n x^n + ... \\ &= g(x) - h_1 x \\ &= g(x) - x \\ \end{align*} \]
於是有 \([g(x)]^2 - g(x) + x = 0\) , \(g_1(x) = \frac{1 \pm \sqrt{1-4x}}{2}\)
又 \(g(0) = 0\)
牛頓二項式展開 \(g(x)\)
\[(1+z)^\frac12 = 1 + \Sigma_{n=1} ^\infty \frac{(-1)^{n-1}}{n \times 2^{2n-1}} \begin{pmatrix} 2n-2 \\ n-1 \end{pmatrix} \qquad \]
得通項
\[h_n = \frac1n \begin{pmatrix} 2n-2 \\ n-1 \end{pmatrix} \qquad \]
參考連結:
class Solution {
public:
int numTrees(int n) {
// wiki:C(2n,n)/n+1 = 2n! / ( n! (n+1)! )
// how to get this ? C_{i+1} = 2*(2*i+1)/(i+2) C_{i}
unsigned long long ans = 1;
for(int i = 0; i < n; ++i)
ans = 2 * (2 * i + 1) * ans / (i + 2);
return ans;
}
};