赞
踩
题目来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems
特别鸣谢:来自夸夸群的 醉笑陪公看落花@知乎,王不懂不懂@知乎,QFIUNE@csdn
感谢醉笑陪公看落花@知乎 倾囊相授,感谢小伙伴们督促学习,一起进步
给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。
输入:n = 3
输出:5
输入:n = 3
输出:5
题目来源 https://leetcode-cn.com/problems
二叉搜索树性质:给定一串序列,生成唯一的一种二叉树
总节点数目为i
的时候,给定一个结点j
则j
的左子树有j-1
个结点,都比j小,有j-1
种排列;右子树中有i-j 个结点,有i-j个结点,都比j大,有i-j种排列
class Solution:
def numTrees(self, n: int) -> int:
dp = [1]*(n+1)
for i in range(2,n+1):
dp[i] = sum([dp[j-1]*dp[i-j] for j in range(1,i+1)])
return dp[n]
给定 i ,j-1 的取值为 0,1,2,3…i-1,i - j 的取值为 i-1,i-2,…3,2,1,0, j-1 和i-j 是对称情况,可以只算一半,这样时间就会减半。再考虑一下奇数和偶数的情况。
class Solution:
def numTrees(self, n: int) -> int:
dp = [1]*(n+1)
dp[2] = 2
for i in range(3,n+1):
rest = dp[i//2+1-1]*dp[i-i//2-1] if i%2==1 else 0
dp[i] = sum([dp[j-1]*dp[i-j] for j in range(1,i//2+1)])*2 + rest
return dp[n]
https://leetcode-cn.com/problems/unique-binary-search-trees/solution/bu-tong-de-er-cha-sou-suo-shu-by-leetcode-solution/
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。