96. 不同的二叉搜索树 - 力扣(LeetCode)
题目要求:
给你一个整数 n
,求恰由 n
个节点组成且节点值从 1
到 n
互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
示例 1:
输入:n = 3 输出:5
示例 2:
输入:n = 1 输出:1
提示:
1 <= n <= 19
解法-1 动态规划 O(N^2):
这个题的思考方式与每日一练:组合总和Ⅳ-CSDN博客一样,先根据问题找到子问题,再推导状态转移方程:
假如现在有i个数,我们选择了第j个数,那么状态转移方程是:
dp[i]+=dp[j-1]*dp[i-j](dp[i]存放当n==i时的二叉搜索树的种数)。
class Solution {
public:
int numTrees(int n) {
vector<int>dp(n+1);
dp[0] = 1;
for(int i = 1;i <= n;i++)
for(int j = 1;j <= i;j++)
dp[i]+=dp[j-1]*dp[i-j];
return dp[n];
}
};