【重拾算法~Leetcode每日一题】96. 不同的二叉搜索树(难度:中等)

96. 不同的二叉搜索树
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
在这里插入图片描述
因为前几天做的题目都是动态规划,所以一拿到题目我第一时间想到的也是动态规划,主要的想法是根据二叉树的一个很好的特性产生的:二叉树去掉第一个根节点后,变成了两个二叉树。
也就是说,我既然要生成二叉树,那必然需要在第一个根节点填上一个数,假如我还剩n-1个数需要填,就变成了n-1个数需要填在两个二叉树的节点上这样两个子问题,我令F( n ) 为给定n所得到的不同结构的二叉搜索树个数,则F( n ) = Σ(a从0到n-1) F( a )* F( n-a-1 )
这里需要注意的是,实际上F ( 0 ) = 0,但是为了数值计算,令F( 0 ) = 1,意思就是说总个数 = 左二叉树的个数 × 右二叉树的个数

class Solution:
    def numTrees(self, n: int) -> int:
        if n==0:
            return 0
        dp =[ 0 for i in range (n+1)]
        dp[0],dp[1] = 1,1
        for i in range(2,n+1):
            for j in range(i):
                dp[i] += dp[j]*dp[i-j-1]
        return dp[n]

在这里插入图片描述
这样做的时间复杂度是O(n²),空间复杂度是( n )

然后我没想到别的思路,就去看了一下题解,题解中说这样一个迭代关系式最后解出来的是卡塔兰数通式为:
在这里插入图片描述
可以直接代入求结果。

明天面试武汉大学,今天题解就写这么多,明天可能要请半天假,如果时间来得及,明天下午面试完再补题解

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值