163 · Unique Binary Search Trees
Algorithms
Medium
Description
Given n, how many structurally unique BSTs (binary search trees) that store values 1…n?
Only $39.9 for the “Twitter Comment System Project Practice” within a limited time of 7 days!
WeChat Notes Twitter for more information(WeChat ID jiuzhang104)
Example
Example 1:
Input:n = 3,
Output: 5
Explanation:there are a total of 5 unique BST’s.
1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \
2 1 2 3
解法1:DP
class Solution {
public:
/**
* @param n: An integer
* @return: An integer
*/
int numTrees(int n) {
if (n == 0) return 1;
vector<int> dp(n + 1, 1); //记得这里default是1。因为左右子树为空的话,因为dp[j] * dp[i - j - 1],这里用到乘积,所以不能是0,必须是1.
dp[1] = 1;
for (int i = 2; i <= n; i++) {
int sum = 0;
for (int j = 0; j < i; j++) {
sum += dp[j] * dp[i - j - 1];
}
dp[i] = sum;
}
return dp[n];
}
};
解法2:Memorization.
class Solution {
public:
int numTrees(int n) {
if (n == 0 || n == 1) return 1;
memo.resize(n + 1, 0);
memo[0] = 1;
memo[1] = 1;
return count(n);
}
private:
vector<int> memo;
int count(int n) {
if (memo[n] > 0) return memo[n];
int res = 0;
for (int i = 0; i < n; i++) {
res += count(i) * count(n - i - 1);
}
memo[n] = res;
return res;
}
};
解法3:直接用Catalan数的公式。