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

server/2024/10/22 10:55:55/

题目

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.ppmy.cn/server/133877.html

相关文章

Apache Seata Raft模式配置中心

本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 本文来自 Apache Seata官方文档&#xff0c;欢迎访问官网&#xff0c;查看更多深度文章。 Apache Seata Raft模式配置中心 title: Seata Raft模式配置中心 author: 蒋奕晨-清华大学&…

FairGuard游戏加固全面适配纯血鸿蒙NEXT

2024年10月8日&#xff0c;华为正式宣布其原生鸿蒙操作系统 HarmonyOS NEXT 进入公测阶段&#xff0c;标志着其自有生态构建的重要里程碑。 作为游戏安全领域领先的第三方服务商&#xff0c;FairGuard游戏加固在早期就加入了鸿蒙生态的开发&#xff0c;基于多项独家技术与十余年…

3.matplotlib基础及用法(全)

一.基础绘图 折线图plot散点图scatter柱状图bar饼图pie 二.图表设置 设置标题设置线条设置坐标轴添加图例添加注释设置画布大小与分辨率 三.高级功能 绘制子图保存图形 一.基础绘图 1.折线图plot import matplotlib.pyplot as plt x [1, 2, 3, 4, 5] y [2, 3, 5, 7, 11] pl…

C#经典排序算法总结(二)

系列文章目录 C#知识点 文章目录 系列文章目录&#x1f449;前言&#x1f449;一、计数排序&#x1f449;1-1 介绍&#x1f449;1-2 动态展示效果&#x1f449;1-3 算法代码如下&#x1f449;1-4 运行结果如下 &#x1f449;二、基数排序&#x1f449;2-1 介绍&#x1f449;2-…

ajax地址参数与data参数运用

ajax的运用 因为项目在进行安全准入检查&#xff0c;也是代码安全的一种处理方式吧&#xff0c;然后我们在进行行加密以及模块加密&#xff0c;就是因为行信息中存在行id可以通过更换行id进行查询其他行的信息&#xff0c;模块也是一样&#xff0c;可能会出现垂直越权以及水平…

AI应用程序低代码构建平台Langflow

什么是 Langflow ? Langflow 是一款适用于 RAG 和多智能体 AI 应用程序的低代码应用构建器。它基于 Python&#xff0c;并且与任何模型、API 或数据库无关。 软件的核心功能 基于 Python 并且与模型、API、数据源或数据库无关。可视化集成开发环境&#xff0c;支持拖放构建和…

在 Qt 中实现一个数据采集程序

在 Qt 中实现一个数据采集程序 在 Qt 中实现一个数据采集程序,可以使用 QThread 来创建多个线程,并使用 QMutex 和 QWaitCondition 来处理缓冲区的线程安全和同步。下面是一个简化的示例,演示了如何实现这样一个程序。 方案概述 数据采集线程:收集数据并将其放入缓冲区。…

中安未来 OCR:开启高效身份证件识别新时代

在数字化快速发展的今天&#xff0c;高效准确地处理各类信息变得至关重要。中安未来 OCR&#xff08;Optical Character Recognition&#xff0c;光学字符识别&#xff09;技术以其卓越的性能和广泛的应用场景&#xff0c;成为了众多企业和机构的得力助手。其中&#xff0c;身份…