Problem: 96. 不同的二叉搜索树
@[力扣96. 不同的二叉搜索树(动态规划解法)]
思路
记dp[i]是长度为i的有序数组所包含的搜索二叉树的个数。
当已知dp[0]~dp[n-1]时,现要求dp[n]:对于长度为n的有序数组,从左向右遍历,当遍历到j时,左边有j-1个元素,右边有n-j个元素,所以左边有dp[j-1]种搜索二叉树构造方法,右边有dp[n-j]种搜索二叉树构造方法,所以遍历到j时,总共有dp[j-1]*dp[n-j]种搜索二叉树的构造方法。
解题方法
状态转移方程对应的代码
for(int j = 1; j <= i; j++)
dp[i] += dp[j - 1] * dp[i - j];
复杂度
- 时间复杂度:
O ( n 2 ) O(n^2) O(n2)
- 空间复杂度:
O ( n ) O(n) O(n)
Code
class Solution {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1; dp[1] = 1;
for(int i = 2; i < n + 1; i++)
for(int j = 1; j <= i; j++)
dp[i] += dp[j - 1] * dp[i - j];
return dp[n];
}
}