您的位置:首页 > 产品设计 > UI/UE

Leetcode 96. Unique Binary Search Trees 不同的二叉搜索树: 两种思路

2019-06-13 15:51 519 查看

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 个节点。

numTrees=numTrees(i−1)∗numTrees(n−i)其中1&lt;=i&lt;=nnumTrees = numTrees(i-1) * numTrees(n-i) 其中1 &lt;= i &lt;= nnumTrees=numTrees(i−1)∗numTrees(n−i)其中1<=i<=n

也就是

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)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];
}
};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: