当前位置: 首页 > news >正文

【动态规划:96. 不同的二叉搜索树】刷题记录

leetcode题目链接

题目:

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

示例 2:
输入:n = 1
输出:1
提示:1 <= n <= 19

1、确定dp数组以及下标的含义

dp[i] 表示 1 到 i 可以组成的互不相同二叉搜索树的种类。

2、确定递推公式

这个题目有些抽象,可以举例推导来找出递推关系。

n = 1 时,只有 1 种,dp[1] = 1。

n = 2 时,1、2 能组成的不同的二叉搜索数有下列 2 种 dp[2] = 2。

n = 3 时,1、2、3 能组成的不同的二叉搜索数有下列 5 种。

让每个数都做一次根节点,当 1 做根节点时,左子树只有为空这 1 种情况,右子树有 2 种情况;当 2 做根节点时,左子树只有 1 种情况,右子树也只有 1 种情况;当 3 做根节点时,左子树有 2 种情况,右子树只有 1 种情况。

在二叉搜索树中,一个节点的左右孩子还是一个二叉搜索树。

不难发现,1 做根节点时,右子树的那 2 种情况其实就是求 2 和 3 能组成的二叉搜索树有多少种,也就是 dp[2] 的值,左子树为空,空也可以看成是 1 种情况,也就是说 dp[0] = 1,那么 1 做根节点时一共有 dp[0] × dp[2] = 2 种情况;2 做根节点时,左右子树各有 1 个节点,那么就是 dp[1] × dp[1] = 1 种情况;3 做根节点时有 dp[2] × dp[0] = 2 种情况;所以当 n = 3 时,一共有 dp[0] × dp[2] + dp[0] × dp[2] + dp[0] × dp[2] = 5 种。

归纳一下,可以得出:

dp[i] += dp[j] * dp[(i - 1) - j];

3、dp数组如何初始化

dp[0] = 1,dp[0] 不在题目要求范围内,为了方便计算,我们定义 0 个节点时为 1 种情况。

4、确定遍历顺序

外层循环从左向右遍历 dp 数组,内层循环是求 dp[i] 的计算过程,j 表示左子树节点个数,(i - 1) - j 表示右子树节点个数。

for (int i = 1; i <= n; i++) { for (int j = 0; j < i; j++) { dp[i] += dp[j] * dp[(i - 1) - j]; } }

5、举例推导dp数组

可以尝试计算 dp[4] ,就不在此赘述了。

class Solution { public int numTrees(int n) { int[] dp = new int[n + 1]; dp[0] = 1; for (int i = 1; i <= n; i++) { for (int j = 0; j < i; j++) { dp[i] += dp[j] * dp[(i - 1) - j]; } } return dp[n]; } }
http://www.cnnetsun.cn/news/125641.html

相关文章:

  • 如何彻底解决WVP-GB28181-Pro视频点播超时:3步快速优化指南
  • 颠覆传统!Windows平台APK安装终极方案全解析
  • 人教人学不会,事教人一次就好(用经历进行职业反思)
  • Obsidian数据迁移全攻略:5步轻松导入Evernote、Notion等笔记
  • 【驱动量化交易12】教你如何通过股票数据api接口获取股票近年分红数据之Python、Java等多种主流语言实例代码演示通过股票数据接口获取数据
  • 8、调试模式与控制输出:探索Expect脚本的高级技巧
  • 13、《深入探究 send 命令:功能、应用与对比》
  • Kotaemon框架入门指南:轻松上手检索增强生成技术
  • EdgeRemover专业指南:彻底移除微软浏览器的技术方案解析
  • 安卓实体手机分辨率适配失败?BlueArchiveAutoScript兼容性深度解决方案
  • Avogadro分子编辑器终极指南:从入门到精通的完整攻略
  • GSE高级宏编译器完整指南:魔兽世界技能自动化终极解决方案
  • 5分钟搞定:PPTist在线演示文稿编辑器的完整部署指南
  • 终极JavaScript转TypeScript迁移指南:如何快速完成代码现代化改造
  • Habitat-Matterport3D数据集完整部署手册
  • 微信消息留存终极解决方案:告别错失重要信息的烦恼
  • OpenDog V3开源四足机器人深度解析与完整指南
  • 终极指南:如何快速配置FanControl.HWInfo插件实现精准风扇控制
  • AdGuard浏览器扩展:彻底告别广告困扰的终极隐私保护方案
  • 5分钟掌握Android MVVM开发:Saber框架完整实战指南
  • 微信小程序图片裁剪完整指南:we-cropper从入门到实战
  • HexEdit:5大核心功能助你轻松掌握二进制文件编辑
  • 高效代码对比:v-code-diff插件完全配置手册
  • 14、Linux系统文件系统安全与管理监控全解析
  • SharpKeys如何彻底改造你的键盘布局?Windows键位自定义完全指南
  • Windows C++构建工具自动化配置指南:5步搞定Node.js原生模块编译环境
  • Mac百度网盘终极加速指南:3步解锁全速下载体验
  • 网盘下载加速工具个性化定制终极攻略
  • Translumo终极教程:20分钟掌握屏幕实时翻译神器
  • WPS-Zotero终极指南:5分钟实现Linux与Windows无缝文献协作