题目链接
题目描述
实现代码
动态规划思想:记dp[i]表示当n个数时的BST个数;可以将其进行拆分,记F[i,n] 表示当i作为根节点&n个数时的BST个数,因此可以得到公式:
dp[n] = F[1,n] + F[2,n] + … + F[n, n]
而对于F[i, n]而言,可以将其看成左右两个子树的递归, 分成两个树看,因此可得公式:
F[i, n] = G(i-1) * G(n-i)
实现代码如下:
class Solution {
public int numTrees(int n) {
if(n == 1) {
return 1;
}
if(n == 2) {
return 2;
}
int[] dp = new int[n+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for(int i=3; i<=n; i++) {
for(int j=1;j<=i; j++) {
dp[i] += dp[j-1] * dp[i-j];
}
}
return dp[n];
}
}