思路转载地址:
https://blog.csdn.net/weixin_35770067/article/details/106119679
https://www.cnblogs.com/grandyang/p/4299608.html
96. Unique Binary Search Trees (不同的二叉搜索树)
Medium
4532167Add to ListShare
Given an integer n
, return the number of structurally unique BST's (binary search trees) which has exactly n
nodes of unique values from 1
to n
.
Example 1:
Input: n = 3 Output: 5
Example 2:
Input: n = 1 Output: 1
Constraints:
1 <= n <= 19
参考思路1:递归
class Solution:
def getAns(self, n: int, memoization: dict) -> int:
ans = 0
if memoization.get(n) is not None:
return memoization.get(n)
# 此时没有数字或者只有一个数字, 返回
if n == 0 or n == 1:
return 1
# 尝试每个数字作为根节点
for i in range(1, n + 1):
# 得到所有可能的左子树
left_trees_num = self.getAns(i - 1, memoization)
# 得到所有可能的右子树
right_trees_num = self.getAns(n - i, memoization)
# 左子树右子树两两组合
ans += left_trees_num * right_trees_num
memoization.__setitem__(n, ans)
return ans
def numTrees(self, n: int) -> int:
if n == 0:
return 0
# 字典保存重复计算
memoization = dict()
return self.getAns(n, memoization)
参考思路2:动态规划
class Solution:
def numTrees(self, n: int) -> int:
dp = [0] * (n + 1)
dp[0] = dp[1] = 1
for i in range(2, n + 1):
# 以i为根节点
for j in range(1, i + 1):
# 左边j-1个数,右边i-j个数
dp[i] = dp[i] + dp[j - 1] * dp[i - j]
return dp[n]