Day 41 动态规划part03 : 343. 整数拆分 96.不同的二叉搜索树

96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19
class Solution(object):
    def numTrees(self, n):
        """
        :type n: int
        :rtype: int
        1.明确dp数组含义: dp[i]表示i对应的dp[i]二叉树的数目
        2.确实递推公式:dp[i] += dp[j - 1] * dp[i - j]; 
          j-1 为j为头结点左子树节点数量,i-j 为以j为头结点右子树节点数量
        3.初始化dp数组: dp[0] = 1, dp[1] = 1, 
        4.确定遍历顺序: 从小到大遍历,大的值是小的值累加推出来的
        5.打印dp数组: debug

        time: O(n^2)
        space: O(n) 用于存储动态规划数组 dp
        """

        # 初始化dp数组
        dp = [0] * (n+1) # 考虑n = 0的特殊情况,所以n+1而不是n

        #base case
        dp[0] = 1
        dp[1] = 1

        
        for i in range(2, n+1):      # 遍历从1到n的每个数字
            for j in range(1,i+1): # 对于每个数字i,计算以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、付费专栏及课程。

余额充值