LeetCode96

给出BST 的中序排列,输出所有可能结构的总数:

在这里插入图片描述

思路

最简单的思路,和code95类似,分别算出left 和 right ,代码如下:

class Solution(object):
    def beTravl(self,start,end):
        if start > end:
            return 1
        if start == end:
            return 1
        root_len = 0
        for root_val in range(start,end+1):
            left =  Solution.beTravl(self,start,root_val-1)
            right = Solution.beTravl(self,root_val+1,end)
#             print(root_val,left,right,root_len)
            root_len = root_len+left*right
        return root_len
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        return Solution.beTravl(self,1,n)

但是,这种结果由于时间复杂度关系,并不能很好的AC完所有数据

思路2 动态规划

思路:

  • 和思路1类似,当以x 为根节点时,一共有 d [ x − 1 ] ∗ d [ n − ( x + 1 ) ] d[x-1]*d[n-(x+1)] d[x1]d[n(x+1)] 中结构。
  • d [ n ] d[n] d[n] 可以通过求 以 1~n-1 为根节点的结构数之和
  • 关键公式如下:
    d [ x ] = d [ x ] + d [ i ] ∗ d [ x − i − 1 ] d[x] = d[x]+d[i]* d[x-i-1] d[x]=d[x]+d[i]d[xi1]
class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        """
        d = [0 for _ in range(n+1)]
        d[0]=1
        d[1]=1
        for x in range(2,n+1):
            # 以 1~x 中的任意任意点为起点
            for i in range(x):
                d[x] = d[x]+d[i]* d[x-i-1]
        return d[n]```


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值