Solution 1
直接的思路就是和之前生成树的过程一致,但是有一个特性:给定n个不同的数字,其构成BST的个数唯一确定。因此可以使用动态规划实现算法。
最优子结构: G ( n ) G(n) G(n),给定n个不同的数字构成的BST个数
回溯逻辑:以这n个数字中的第i个数字为根节点,其能构成的BST为前i-1个数字构成BST个数和后n-i个数字构成的BST个数的乘积
边界条件: G ( 0 ) = 1 G(0) = 1 G(0)=1, G ( 1 ) = 1 G(1)=1 G(1)=1
- 时间复杂度: O ( n 2 ) O(n^2) O(n2),其中 n n n为输入的数字个数
- 空间复杂度: O ( n ) O(n) O(n),其中 n n n为输入的数字个数
class Solution {
public:
int numTrees(int n) {
if (n <= 1) {
return n;
}
vector<int> ans = {1, 1};
for (int i = 2; i <= n; ++i) {
int sum = 0;
for (int j = 0; j < i; ++j) {
sum += ans[j] * ans[i - j - 1];
}
ans.push_back(sum);
}
return ans[n];
}
};
Solution 2
Solution 1的Python实现
class Solution:
def numTrees(self, n: int) -> int:
if n <= 1:
return n
ans = [1, 1]
for i in range(2, n + 1):
temp = 0
for j in range(i):
temp += ans[j] * ans[i - j - 1]
ans.append(temp)
return ans[n]