96. Unique Binary Search Trees

稍微有那么点意思了,用的DP。

修修改改,居然做出来了。
思路就是N的时候
分别以1,2,3,4...n为ROOT
左边分别有
n-1,n-2...0
0,1,2,3...n-1

DP[n]表示n有几种可能:
0表示null,就1种可能
1也只有1种可能。

所以就是dp左边*dp右边

public class Solution {
    public int numTrees(int n) {
        if(n == 0) return 1;
        if(n == 1) return 1;
        
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        
        for(int i = 2; i <=n; i++)
        {
            for(int j = 1; j <= i;j++)
            {
                dp[i] += dp[j-1]*dp[i-j];
                //System.out.println(dp[i]);
            }
        }
        
        return dp[n];
    }
}

好开心啊。。自己做出来了~~



我一刷是怎么做出来的。。。

比如N=5的时候,我们可以以1 2 3 4 5作为ROOT。
假设以3作为ROOT,左边有2种可能,右边有2种可能,最后就是4种可能。
以2为ROOT的话,左边有1种可能,右边是(345)组成的二叉树的可能。

这么看来是动态规划。

n = 5 就是以12345为ROOT的所有可能性加起来。。

每种可能性里,左右的可能性要相乘。

public class Solution {
    public int numTrees(int n) {
        if (n == 0) return 1;
        
        int[] dp = new int[n+1];
        dp[0] = 1;
        dp[1] = 1;
        
        for (int i = 2; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                dp[i] += dp[i - j] * dp[j - 1];
            }
        }
        
        return dp[n];
    }
}
原文地址:https://www.cnblogs.com/reboot329/p/6112106.html