96. Unique Binary Search Trees

思路转载地址:

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]
    
        

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值