给你一个正整数 n, 代表了BST中节点的个数。那么可以构造出多少个异构的BST。
例如: n=3时,有5个异构的BST,如下所示。
1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1 2 3方法一:
// O(n) time, O(1) space
public int numTrees(int n) {
int c = 1;
for (int i = 2; i <= n; i++)
c = 2*(2*i-1)*c/(i+1);
return c;
}
方法二:
- f(n) = \sum_{i=1}^n f(i-1) * f(n-i), f(0) = 1, f(1) = 1;
- This is nature for DP (see below).
- f(n) = (2n)!/n!*(n+1)!, called Catalan number
class Solution {
public:
int numTrees(int n) {
vector<int> num(n+1, 0);
num[0] = 1;
if(n > 0) num[1] = 1;
for(int i = 2; i < n+1; i++) {
for(int j = 0; j < i; j++) {
num[i] += num[j]*num[i-j-1];
}
}
return num[n];
}
};