larscheng / algo

0 stars 0 forks source link

【Day 68 】2024-01-22 - 96. 不同的二叉搜索树 #68

Open larscheng opened 5 months ago

larscheng commented 5 months ago

https://leetcode-cn.com/problems/unique-binary-search-trees/

larscheng commented 5 months ago

思路

G(n)的值可以通过遍历所有i,以i为根节点构造二叉搜索数,累加所有二叉搜索数的总数

G(n) = f(1,n)+f(2,n)+....+f(i,n) 其中序列长度为1或者n=0时 G(0)=f(1,0)=1, G(1)=f(1,1)=1

对于f(i,n)则可通过左子数G(i-1)和右子数G(n-i)的所有组合方式计算得出

f(i,n) = G(i-1)*G(n-i)

所以

G(n) = G(1-1)G(n-1) + G(2-1)G(n-2) + .... + G(i-1)*G(n-i)

代码

    public int numTrees(int n) {
        int[] G = new int[n + 1];
        G[0] = 1;
        G[1] = 1;
        for (int m = 2; m <= n; m++) {
            for (int i = 1; i <= m; i++) {
                G[m] += G[i - 1] * G[m - i];
            }
        }
        return G[n];
    }

复杂度