LC.P96[不同的二叉搜索树]

方法一:区间DP

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int numTrees(int n) {
int[] f = new int[n + 1];
f[0] = 1;
f[1] = 1;
for (int i = 2; i <= n; ++i) {
for (int j = 1; j <= i; ++j) {
f[i] += f[j - 1] * f[i - j];
}
}
return f[n];
}
}
  • 时间复杂度:$O(n^2)$
  • 空间复杂度:$O(n)$

方法二:数学—卡特兰数

卡特兰数,公式为 $C_{n + 1} = \frac {C_{n} \times (4n + 2)} {n + 2} $

1
2
3
4
5
6
7
class Solution {
public int numTrees(int n) {
long ans = 1;
for (int i = 0; i < n; i++) ans = ans * (4 * i + 2) / (i + 2);
return (int)ans;
}
}
  • 时间复杂度:$O(n)$
  • 空间复杂度:$O(1)$