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

leetcode动态规划(八)-不同的二叉搜索树

题目

96.不同的二叉搜索树

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

思路

题目一看很难有思路,先从1开始一步步看看少数节点时的情况

当n=1的时候

当n=2的时候

当n=3的时候

当1是头节点的时候,左子树是空的,右子树有两个节点2和3,这里2和3的布局是和n=2的时候布局是一样的

当2是头节点的时候,左子树只有1这个节点,右子树只有3这个节点

当3是头节点的时候,右子树是空的,左子树有1和2两个节点,这里1和2的布局是和n=2的时候布局是一样的

dp[3]就是头节点为1的二叉搜索树数量+头节点为2的二叉搜索树数量+头节点为3的二叉搜索树数量

元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

有2个元素的搜索树数量就是dp[2]。

有1个元素的搜索树数量就是dp[1]。

有0个元素的搜索树数量就是dp[0]。

所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]

接下来就是动规五步曲

1.确定dp数组(dp table)以及下标的含义

dp[i]表示第i个节点一共有dp[i]种不同的二叉搜索树

2.确定递推公式

dp[i] += dp[j-1]*dp[i-j]

3.dp数组如何初始化

其中dp[0]表示有0个节点,也是一种二叉树,可以等于1

4.确定遍历顺序

从递归公式:dp[i] += dp[j - 1] * dp[i - j]可以看出,节点数为i的状态是依靠 i之前节点数的状态。

那么遍历i里面每一个数作为头结点的状态,用j来遍历。

5.举例推导dp数组

代码 

lass Solution:def numTrees(self, n: int) -> int:dp = [0]*(n+1)dp[0] = 1# dp[1] = 1# dp[2] = 2for i in range(1,n+1):for j in range(1,i+1):dp[i] += dp[j-1]*dp[i-j]return dp[-1]


http://www.mrgr.cn/news/55441.html

相关文章:

  • JRT怎么从IRIS切换到PostGreSql库
  • 在Rocky Linux上安装Docker
  • TCP/UDP 通用通信代码库(C语言实现)
  • 胤娲科技:AI大模型的隐秘战争——当“智能”成为双刃剑
  • 除GOF23种设计模式之简单工厂模式
  • Docker-registry私有镜像仓库的安装
  • 生信学院|10月22日《SOLIDWORKS 自定义属性卡片应用》
  • React第十一章(useReducer)
  • 如何解决企业异地办公网络难题?
  • 持续输出面试题系列之SpringCloud篇
  • 数造科技荣获2024DAMA中国“数据治理创新奖”
  • 4.1粒子系统
  • C++游戏开发入门:用 SDL 实现你的第一个 2D 游戏
  • 汕头市自闭症全托管学校,为孩子打开未来大门
  • consumer 角度讲一下i2c外设
  • 实现了通过摄像头检测手部手势来控制 B 站视频播放的功能。它使用了 OpenCV 进行视频捕获和图像处理,MediaPipe 进行手部检测和关键点识别
  • 五台山景点购票系统——后附计算机源码
  • Windows下搭建VUE开发环境
  • 87 VRRPV2/V3 综合技术实操
  • 冒泡排序(Python)
  • 用Python制作《我的世界》风格小游戏:入门指南
  • java获取当前服务器的cpu核数、cpu信息
  • git 免密的方法
  • 如何设计简易版Synchronized:实现锁的机制与优化策略
  • NAND 数据恢复:使用 VNR 闪存数据恢复软件提取闪存转储中的块
  • 记录一下,解决el-table表格自定义数据后,数据不显示问题