Leetcode 96. Unique Binary Search Trees 不同的二叉搜索树: 两种思路
96. Unique Binary Search Trees 不同的二叉搜索树
题目描述
Given n, how many structurally unique BST’s (binary search trees) that store values 1 … n?
示例:
Example:
Input: 3
Output: 5
Explanation:
Given n = 3, there are a total of 5 unique BST's:
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
解答
这道题可以有两种解法,一种是递归,另一种是DP,本质上都是一样的。
给定一个root(for root in n)节点, 假设他的左子树有i - 1各节点,则右子树有n - i 个节点。
则
n u m T r e e s = n u m T r e e s ( i − 1 ) ∗ n u m T r e e s ( n − i ) 其 中 1 < = i < = n numTrees = numTrees(i-1) * numTrees(n-i) 其中1 <= i <= n numTrees=numTrees(i−1)∗numTrees(n−i)其中1<=i<=n
也就是
n u m T r e e s ( n ) = n u m T r e e s ( 0 ) ∗ n u m T r e e s ( n − 1 ) + n u m T r e e s ( 1 ) ∗ n u m T r e e s ( n − 2 ) + … + n u m T r e e s ( n − 1 ) ∗ n u m T r e e s ( 0 ) numTrees(n) = numTrees(0) * numTrees(n-1) + numTrees(1) * numTrees(n-2) + … + numTrees(n-1) * numTrees(0) numTrees(n)=numTrees(0)∗numTrees(n−1)+numTrees(1)∗numTrees(n−2)+…+numTrees(n−1)∗numTrees(0)
代码如下
代码
class Solution {
public:
int numTrees(int n) {
if (n == 0 || n == 1) return 1;
if(up.find(n) != up.end()) return up[n];
auto res = 0;
for (int i = 1; i <= n; i++) {
cout << res << '\n';
res += numTrees(i - 1) * numTrees(n - i);
}
up[n] = res;
return res;
}
private:
unordered_map<int, int> up;
};
class Solution {
public:
int numTrees(int n) {
vector<int> vec(n + 1,0);
vec[0] = 1;
vec[1] = 1;
for(int i = 2; i <= n; i++) {
for(int j = 1; j <= i; j ++)
vec[i] = vec[j - 1] * vec[i - j];
}
return G[n];
}
};