96. Unique Binary Search Trees

题目链接

题目大意:1~n的自然数,可以组成多少个不同的二叉搜索树。例子如下:

法一:卡特兰数。通项公式C(2n, n)/(n+1)=C(2n, n) - C(2n, n+1)。代码如下(耗时0ms):

1     public int numTrees(int n) {
2         //卡特兰数
3         //C(2n, n)/(n+1)
4         long res = 1;
5         for(int i = n + 1; i <= n * 2; i++) {
6             res = res * i / (i - n);
7         }
8         return (int)(res / (n + 1));
9     }
View Code

法二:DP。利用的也是卡特兰数。代码如下(耗时0ms):

 1     public int numTrees(int n) {
 2         int[] dp = new int[n + 1];
 3         dp[0] = 1;
 4         dp[1] = 1;
 5         for(int i = 2; i <= n; i++) {
 6             for(int j = 0; j < i; j++) {
 7                 dp[i] += dp[j] * dp[i - j - 1];
 8             }
 9         }
10         return dp[n];
11     }
View Code

 

posted on 2018-06-02 11:27  二十年后20  阅读(131)  评论(0编辑  收藏  举报

导航