1. 程式人生 > 其它 >一篇文章搞懂Mysql(乾貨!)

一篇文章搞懂Mysql(乾貨!)

96. 不同的二叉搜尋樹

96. 不同的二叉搜尋樹

// [96. 不同的二叉搜尋樹](https://leetcode-cn.com/problems/unique-binary-search-trees/)
// n個整數-> 每個整數都可以作為根節點 for(i: n)-> [1, i-1]左子樹, [i+1,n]右子樹 dp[1] = 1
// 遞推公式直接就出來了 dp[i]表示 n=i時候可以構成的種數, dp[i] = dp[left] * dp[right], left(左子樹節點數=i-1),right(右子樹節點數n-i)
// 比如 dp[3] = 根節點為1 + 根節點為2 + 根節點為3, 其中根節點為2時, dp[3] = dp[1] * dp[1] = 1
// 這樣程式碼就很容易寫出來了
class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 1;//不管一個節點還是空子樹都只有一種情況
        dp[1] = 1;
        for (int i = 2; i <= n; i++) {
            for (int root = 1; root <= i; root++) {
                dp[i] += (dp[root - 1] * dp[i - root]);
            }
        }
        return dp[n];
    }
}
// 優化, 由於種類數是對稱的, 可以這樣計算 for (int root = 1; root <= i/2; root ++) dp[i] += (dp[root - 1] * dp[i - root])*2; 奇數個數還需要補充左右子樹個數一樣的種類數
class Solution2 {
    public int numTrees(int n) {
        return 0;
    }
}
// 數學推導就是這樣的
// G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n)
// f(i)=G(i−1)∗G(n−i)
// G(n)=G(0)∗G(n−1)+G(1)∗(n−2)+...+G(n−1)∗G(0) ;卡特蘭數