leetcode 力扣 96 不同的二叉搜索树

69 阅读1分钟

动态规划 + 笛卡尔积,背就完了

F(i)表示以i为根结点的不同二叉搜索树的全部数量,G(n)表示由n个结点组成的不同二叉搜索树的全部数量,相乘表示笛卡尔积,比如由2个结点组成的不同左子树,与由3个结点组成的不同右子树,以及由3个结点组成的不同左子树,与由2个结点组成的不同右子树,他们的全部组合

下式不能直接带入代码中,因为G(n)是从2个结点开始累加, G(n - 1)不符合
F(i)=G(i1)G(n1)F(i) = G(i - 1) * G(n - 1)

G(n)=i=1nF(i)G(n) = \sum\limits_{i=1}^nF(i)

// g(3) += g(0)*g(2)
// g(3) += g(1)*g(1)
// g(3) += g(2)*g(0)

public int numTrees(int n) {
        int[] G = new int[n + 1];
        G[0] = 1;
        G[1] = 1;

        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                G[i] += G[j - 1] * G[i - j];
            }
        }

        return G[n];
    }