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

【LeetCode】动态规划—96. 不同的二叉搜索树(附完整Python/C++代码)

动态规划—96. 不同的二叉搜索树

  • 题目描述
  • 前言
  • 基本思路
    • 1. 问题定义
    • 2. 理解问题和递推关系
      • 二叉搜索树的性质:
      • 核心思路:
      • 状态定义:
      • 状态转移方程:
      • 边界条件:
    • 3. 解决方法
      • 动态规划方法:
      • 伪代码:
    • 4. 进一步优化
    • 5. 小总结
  • Python代码
      • Python代码解释
  • C++代码
      • C++代码解释
  • 总结

题目描述

在这里插入图片描述

前言

不同的二叉搜索树问题 是一个经典的动态规划问题。给定一个整数 n,我们需要构造出由 n 个节点组成的所有不同的 二叉搜索树(BST)。在这类问题中,我们不仅需要理解二叉搜索树的性质,还需要通过动态规划来计算不同形态的二叉搜索树的数量。


基本思路

1. 问题定义

给定一个整数 n,求由 n 个节点构成的所有不同的二叉搜索树的数量。每个二叉搜索树的节点包含从 1n 的整数,每个整数只能使用一次。

2. 理解问题和递推关系

二叉搜索树的性质:

  • 二叉搜索树(BST)的性质是,对于每个节点:
    • 左子树上所有节点的值都小于该节点的值。
    • 右子树上所有节点的值都大于该节点的值。

核心思路:

如果我们选择节点 i 作为根节点,那么:

  1. 节点 1i-1 会组成根节点 i 的左子树。
  2. 节点 i+1n 会组成根节点 i 的右子树。
  3. 左子树和右子树的组合方式可以递归地进行计算,最终组合成完整的 BST。

状态定义:

dp[i] 表示 i 个节点能构成的不同二叉搜索树的数量。最终我们要求解的是 dp[n]

状态转移方程:

对于每一个根节点 i,它的左子树有 i-1 个节点,右子树有 n-i 个节点。左子树和右子树的组合方式相乘,即:
d p [ i ] = ∑ k = 1 i d p [ k − 1 ] × d p [ i − k ] dp[i] = \sum_{k=1}^{i} dp[k-1] \times dp[i-k] dp[i]=k=1idp[k1]×dp[ik]
其中,dp[k-1] 表示左子树的组合数,dp[i-k] 表示右子树的组合数。

边界条件:

  • n = 0 时,空树也是一种二叉搜索树,因此 dp[0] = 1

3. 解决方法

动态规划方法:

  1. 初始化一个数组 dp,其中 dp[0] = 1,表示空树。
  2. 使用递推公式计算 dp[i],即根据左子树和右子树的组合方式来更新 dp 数组。
  3. 最终 dp[n] 即为 n 个节点构成的不同二叉搜索树的数量。

伪代码:

initialize dp array with dp[0] = 1
for i from 1 to n:for j from 1 to i:dp[i] += dp[j-1] * dp[i-j]
return dp[n]

4. 进一步优化

  • 空间优化:由于每个 dp[i] 只依赖于之前的状态,因此我们已经使用最小的空间来存储这些状态。
  • 时间复杂度:动态规划的时间复杂度为 O(n^2),适合处理中等规模的输入。

5. 小总结

  • 问题思路:通过递归地构建左子树和右子树,利用动态规划的思想,可以高效计算不同二叉搜索树的数量。
  • 核心公式:状态转移方程 dp[i] = \sum_{k=1}^{i} dp[k-1] \times dp[i-k],每次通过左子树和右子树的组合方式进行计算。

以上就是不同的二叉搜索树问题的基本思路。


Python代码

class Solution:def numTrees(self, n: int) -> int:# 初始化dp数组,dp[i]表示i个节点能构成的不同二叉搜索树的数量dp = [0] * (n + 1)dp[0] = 1  # 空树也是一种二叉搜索树# 动态规划计算每个dp[i]的值for i in range(1, n + 1):for j in range(1, i + 1):dp[i] += dp[j - 1] * dp[i - j]return dp[n]  # 返回n个节点能构成的不同二叉搜索树的数量

Python代码解释

  1. 初始化:定义一个 dp 数组,dp[i] 表示 i 个节点能构成的不同二叉搜索树的数量。初始值 dp[0] = 1,表示空树。
  2. 动态规划递推:使用状态转移公式更新 dp 数组,每次根据左子树和右子树的组合方式来累加。
  3. 返回结果:返回 dp[n],即 n 个节点可以构成的不同二叉搜索树的数量。

C++代码

class Solution {
public:int numTrees(int n) {// 初始化dp数组,dp[i]表示i个节点能构成的不同二叉搜索树的数量vector<int> dp(n + 1, 0);dp[0] = 1;  // 空树也是一种二叉搜索树// 动态规划计算每个dp[i]的值for (int i = 1; i <= n; ++i) {for (int j = 1; j <= i; ++j) {dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];  // 返回n个节点能构成的不同二叉搜索树的数量}
};

C++代码解释

  1. 初始化:定义一个 dp 数组,dp[i] 表示 i 个节点能构成的不同二叉搜索树的数量。初始值 dp[0] = 1,表示空树。
  2. 动态规划递推:使用状态转移公式更新 dp 数组,每次根据左子树和右子树的组合方式来累加。
  3. 返回结果:返回 dp[n],即 n 个节点可以构成的不同二叉搜索树的数量。

总结

  • 核心思路:通过递归构建不同的左子树和右子树,利用动态规划求解不同二叉搜索树的数量。每一个根节点的左子树和右子树的组合数相乘即为该根节点对应的不同二叉搜索树的数量。
  • 时间复杂度:时间复杂度为 O(n^2),适合处理中等规模的输入。
  • 动态规划应用:该问题展示了动态规划在树形结构问题中的应用,通过递推和组合的方式有效解决了求解二叉搜索树数量的问题。

相关文章:

【LeetCode】动态规划—96. 不同的二叉搜索树(附完整Python/C++代码)

动态规划—96. 不同的二叉搜索树 题目描述前言基本思路1. 问题定义2. 理解问题和递推关系二叉搜索树的性质&#xff1a;核心思路&#xff1a;状态定义&#xff1a;状态转移方程&#xff1a;边界条件&#xff1a; 3. 解决方法动态规划方法&#xff1a;伪代码&#xff1a; 4. 进一…...

Nginx UI 一个可以管理Nginx的图形化界面工具

Nginx UI 是一个基于 Web 的图形界面管理工具&#xff0c;支持对 Nginx 的各项配置和状态进行直观的操作和监控。 Nginx UI 的功能非常丰富&#xff1a; 在线查看服务器 CPU、内存、系统负载、磁盘使用率等指标 在线 ChatGPT 助理 一键申请和自动续签 Let’s encrypt 证书 在…...

Vue向上滚动加载数据时防止内容闪动

目前的需求&#xff1a;当前组件向上滚动加载数据&#xff0c;dom加载完后&#xff0c;页面的元素位置不能发生变化 遇到的问题&#xff1a;加载完数据后&#xff0c;又把滚轮滚到之前记录的位置时&#xff0c;内容发生闪动 现在的方案&#xff1a; 加载数据之前记录整体滚动条…...

基于QT、ARM的智能停车管理系统+高分项目+源码

Parking-management-system 本系统基于QT、ARM开发板、Linux系统并对接百度AI 1.1 项目目的: 创建一个智能停车管理系统&#xff0c;能够停入车辆和取出车辆以及查询车辆停入停车场的状态并且计算车辆离开时收费情况。 1.2 项目意义: 实现停车场智能抬杆和智能收费系统&…...

1.6,unity动画Animator屏蔽某个部位,动画组合

动画组合 一边跑一边攻击 using System.Collections; using System.Collections.Generic; using UnityEngine;public class One : MonoBehaviour {private Animator anim;// Start is called before the first frame updatevoid Start(){anim GetComponent<Animator>();…...

发动机冷却系统排空气

发动机冷却系统排空气的几种常见方法 发动机冷却系统是汽车发动机的重要组成部分&#xff0c;它的主要作用是通过循环冷却液来吸收和散发发动机产生的热量&#xff0c;确保发动机在正常工作温度下运行。然而&#xff0c;在冷却系统的运行过程中&#xff0c;由于各种原因&#…...

三周精通FastAPI:1 第一步入门

FastAPI是一个非常棒的python web和api框架&#xff0c;准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程&#xff1a;教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用&#xff08;它们实际上是经过测试的 Python 文件&#x…...

RestTemplate基本使用之HTTP实现GET请求和POST请求

一、GET请求实例 public static TianQi getTianQi(String city) {RestTemplate restTemplate new RestTemplate();HashMap res restTemplate.getForObject("http://www.tianqiapi.com/api/?versionv6&appid15118158&appsecretgVNnwva8&city" city, H…...

2024-10-18 问AI: [AI面试题] 神经网络有哪些不同类型?

文心一言 神经网络有多种不同类型&#xff0c;每种类型都有其特定的结构和应用场景。以下是一些主要的神经网络类型&#xff1a; 前馈神经网络&#xff08;FNN&#xff09;&#xff1a; 也称为全连接神经网络或感知器网络。由输入层、隐藏层和输出层组成&#xff0c;信息流是单…...

【开源免费】基于SpringBoot+Vue.JS课程作业管理系统(JAVA毕业设计)

本文项目编号 T 023 &#xff0c;文末自助获取源码 \color{red}{T023&#xff0c;文末自助获取源码} T023&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…...

jmeter中对于有中文内容的csv文件怎么保存

jmeter的功能很强大&#xff0c;但是细节处没把握好就得不到预期的结果。今天来讲讲有中文内容的csv文件的参数化使用中需要注意的事项。 对于有中文内容&#xff0c;涉及到编码格式&#xff0c;为了让jmeter能正确地读取csv文件中的中文&#xff0c;需要把文件转码为UTF-8BOM…...

Leetcode 921 Shortest Path in Binary Matrix

题意&#xff1a;求二维矩阵中往8个方向移动的话&#xff0c;从左上方到右下方移动的最短路径 https://leetcode.com/problems/shortest-path-in-binary-matrix/description/ 解答&#xff1a;bfs易得 class Solution { public:int shortestPathBinaryMatrix(vector<vecto…...

第二十二篇——菲欧几何:相对论的数学基础是什么?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 对于几何的几个工具&#xff0c;让我再次感叹数学的伟大&#xff0c;逻辑…...

【AI整合包及教程】EchoMimic:开创数字人新时代,让静态图像“活”起来!

在数字化浪潮的推动下&#xff0c;人工智能技术正以前所未有的速度渗透到我们生活的方方面面。从智能家居到自动驾驶&#xff0c;从智能客服到医疗诊断&#xff0c;AI的触角无处不在。而如今&#xff0c;阿里巴巴旗下的蚂蚁集团再次引领潮流&#xff0c;宣布开源其革命性的数字…...

ArcGIS 最新底图服务地址

ArcGIS 最新底图服务地址 说明 先上地址&#xff1a; 地形图&#xff1a; https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hillshade/MapServer深色地形图&#xff1a;https://services.arcgisonline.com/arcgis/rest/services/Elevation/World_Hi…...

【服务器部署】Docker部署小程序

一、下载Docker 安装之前&#xff0c;一定查看是否安装docker&#xff0c;如果有&#xff0c;卸载老版本 我是虚拟机装的Centos7&#xff0c;linux 3.10 内核&#xff0c;docker官方说至少3.8以上&#xff0c;建议3.10以上&#xff08;ubuntu下要linux内核3.8以上&#xff0c…...

三菱FX PLC设计一个电子钟程序实例

在这里介绍三菱FX系列PLC的计数器C的功能、结构&#xff0c;计数过程及工作原理。 功能&#xff1a; 对内部元件X、Y、M、S、T、C的信号进行计数。 结构&#xff1a; 线圈、触点、设定值寄存器、当前值寄存器。 地址编号&#xff1a; 字母C&#xff0b;&#xff08;…...

妇女、商业与法律(WBL)(1971-2023年)

WBL项目由世界银行开发&#xff0c;旨在通过分析时间序列数据&#xff0c;研究女性机会不平等与劳动市场动态之间的关系。该项目提供了1971年至2023年的190个经济体的面板数据&#xff0c;包括8个评分指标和35个数据点&#xff0c;涵盖了流动性、工作场所、薪酬、婚姻、父母身份…...

python 卸载、安装、virtualenv

前言 本文汇总下python环境的安装与卸载。 卸载python环境 卸载系统环境内的python环境 python_version_number3.10 sudo rm -rf /Library/Frameworks/Python.framework/Versions/${python_version_number}/ sudo rm -rf "/Applications/Python ${python_version_numb…...

ubuntu24.0离线安装Ollama和纯cpu版本以及对接Spring AI

文章目录 一.官网下载 0.3.13版本二.将文件包上传至ubuntu服务器三.下载安装脚本四.剔除GPU相关下载ROCM等&#xff0c;纯CPU运行脚本五.ollama常用命令六. 远程测试 七.对接spring AI 一.官网下载 0.3.13版本 ollama离线安装包下载地址 二.将文件包上传至ubuntu服务器 三.下…...

机器学习核心:监督学习与无监督学习

个人主页&#xff1a;chian-ocean 文章专栏 监督学习与无监督学习&#xff1a;深度解析 机器学习是现代人工智能的核心支柱&#xff0c;已广泛应用于从数据挖掘到计算机视觉再到自然语言处理的诸多领域。作为机器学习最主要的两大类型&#xff0c;监督学习&#xff08;Super…...

服务器托管的优缺点有哪些?

由于数字化程度不断提高&#xff0c;服务器在日常业务中发挥着越来越重要的作用。在大多数情况下&#xff0c;服务器由公司自己维护和管理。但对于一些公司来说&#xff0c;托管服务器(将这些任务交给专业人员)是更好的选择。 关于服务器的优缺点&#xff0c;有一点是明确的&am…...

RestClient查询文档排序、分页和高亮

目录 排序、分页 高亮 高亮请求构建 高亮结果解析 排序、分页 搜索结果的排序和分页是与query同级的参数&#xff0c;因此同样是使用request.source()来设置。 对应的API如下&#xff1a; 完整代码示例&#xff1a; Test void testPageAndSort() throws IOException {// …...

API项目5:申请签名 在线调用接口

开发申请签名 现在用户已经能看到这个接口了&#xff0c;也能看到这个接口文档&#xff0c;接下来就要在线调用 现在我们可以给每个新注册的用户自动分配一个签名和密钥&#xff0c;去修改一下注册流程&#xff1a; backend 项目&#xff0c;找到 UserServiceImpl.java 中的…...

Google FabricDiffusion:开启3D虚拟试穿新篇章

随着数字化转型的步伐不断加快,时尚界也在探索如何利用最新技术为消费者带来更加沉浸式的购物体验。在这一背景下,Google 推出了一项名为 FabricDiffusion 的新技术,这项技术能够将2D服装图像中的高质量织物纹理转移到任意形状的3D服装模型上,从而为3D虚拟试穿提供了更为真…...

【开发语言】c++的发展前景

C作为一种历史悠久且功能强大的编程语言&#xff0c;在软件开发领域一直保持着其独特的地位和广泛的应用前景。尽管近年来出现了许多新的编程语言和技术趋势&#xff0c;但C由于其高性能、低层访问能力以及广泛的生态系统&#xff0c;在多个领域依然具有不可替代的优势。以下是…...

【机器学习】图像识别——计算机视觉在工业自动化中的应用

1. 引言 随着人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;的快速发展&#xff0c;计算机视觉已成为工业自动化中的核心技术之一。图像识别&#xff0c;作为计算机视觉领域的重要分支&#xff0c;能够通过分析和理解图像或视频数据来识别、分类或检…...

lstm基础知识

lstm前言 LSTM(Long short-term memory)通过刻意的设计来避免长期依赖问题&#xff0c;是一种特殊的RNN。长时间记住信息实际上是 LSTM 的默认行为&#xff0c;而不是需要努力学习的东西&#xff01; 在标准的RNN中&#xff0c;这个重复模块具有非常简单的结构&#xff0c;例…...

Linux :at crontab简述

at命令 在指定的日期、时间点自动执行预先设置的一些命令操作&#xff0c;属于一次性计划任务系统服务的名称&#xff1a;/etc/init.d/atd存放一次性计划任务的文件&#xff1a;/var/spool/at/^a 依靠 /etc/at.allow&#xff08;白名单&#xff09;和 /etc/at.deny&#xff08…...

Python,Swift,Haskell三种语言在使用正则表达式上的方法对比

这里插入图片描述](https://i-blog.csdnimg.cn/direct/fea1494d0d0c4c9880881493929a8b91.png)在讨论 Python、Swift 和 Haskell 在正则表达式处理字符串方面的优缺点时&#xff0c;可以从它们对正则表达式的支持、灵活性和性能进行比较。以下通过具体的正则表达式字符串匹配例…...