
LeetCode 96. Unique Binary Search Trees
发布日期:2025-04-05 00:39:47
浏览次数:11
分类:精选文章
本文共 944 字,大约阅读时间需要 3 分钟。
给定n,如何计算存储值1到n的所有不同的二叉搜索树(BST)的个数?
问题分析
这是一个经典的动态规划问题,涉及计数全局不同的二叉搜索树的数量。当n=3时,可以有5种不同的 BST,这一点很直观。
动态规划解法
我们设dp[i]表示使用1到i值构造的所有全局不同 BST的数量。我们可以通过以下方式计算:
初始条件:
- dp[0] = 1:表示只有一个空树。
- dp[1] = 1:只有一棵含有单个节点的树。
状态转移方程:
- 对于i个节点,选择其中一个节点作为根。左子树有j个节点,右子树则有i-j-1个节点。
- 对每个j的可能取值,计算左子树的数目dp[j]乘以右子树的数目dp[i-j-1],并对所有j求和。
整个过程可以用公式表示为:[dp[i] = \sum_{j=0}^{i-1} dp[j] \times dp[i-j-1]]
实现步骤:
- 从i=2开始,迭代到n。
- 对于每个i,j从0遍历到i-1,计算乘积之和。
解释
这个动态规划方法通过逐渐构建 BST,从简单情况开始,逐步解决复杂情况。状态转移方程考虑了 BST 的构造方式,即每个可能的根节点以及其左右子树的可能性。这种方法的时间复杂度是 O(n²),空间复杂度为 O(n)。
代码实现
public class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1; dp[1] = 1; for(int i = 2; i <= n; i++) { for(int j = 0; j < i; j++) { dp[i] += dp[j] * dp[i - j - 1]; } } return dp[n]; }}
注意事项
- 初始化:确保dp数组的大小为n+1,避免越界。
- 循环条件:外层循环从i=2到n,内层循环j从0到i-1。
- 结果计算:dp[i]的值直到i=n时才得到最终结果。
这个解法使用动态规划高效地解决了问题,并确保了在整数范围内的正确性。
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2025年05月11日 13时11分33秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
pair的用法
2021-05-12
javaWeb服务详解(含源代码,测试通过,注释) ——Emp的Dao层
2021-05-14
echarts 基本图表开发小结
2021-05-14
TreeSet、TreeMap
2021-05-14
GitHub上传时,项目在已有文档时直接push出现错误解决方案
2021-05-14
嵌入式系统试题库(CSU)
2021-05-15
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
2021-05-15
00013.05 字符串比较
2021-05-15
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
2021-05-16
Android 架构组件 – 让天下没有难做的 App
2021-05-16
能解决数据可视化大屏需求的3款可视化工具
2021-05-16
第01问:MySQL 一次 insert 刷几次盘?
2021-05-16
laravel server error 服务器内部错误
2021-05-18
一道简单的访问越界、栈溢出pwn解题记录
2021-05-18
响应的HTTP协议格式+常见的响应码
2021-05-18
springboot redis key乱码
2021-05-19
解决打开 json 文件中文乱码的问题
2025-03-28