LeetCode96. 不同的二叉搜索树

96. 不同的二叉搜索树

文章目录

    • [96. 不同的二叉搜索树](https://leetcode.cn/problems/unique-binary-search-trees/)
      • 一、题目
      • 二、题解


一、题目

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

示例 1:

img

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

二、题解

这道题目是求由 n 个节点组成的且节点值从 1 到 n 互不相同的二叉搜索树的种数,我们可以通过动态规划来解决。

算法思路

  1. 分析问题特点:首先,我们需要明确什么是二叉搜索树(BST)以及如何构建它们。BST 是一种特殊的二叉树,满足以下性质:左子树上的所有节点的值都小于根节点的值,右子树上的所有节点的值都大于根节点的值,且左右子树也分别是 BST。
  2. 问题分解:考虑解决问题的分解方式。假设我们已经知道了 1 到 i-1 个节点可以构成的 BST 种数,以及 i+1 到 n 个节点可以构成的 BST 种数,那么如何计算由 i 个节点构成的 BST 种数呢?
  3. 以节点 i 为根节点:我们可以考虑将节点 i 作为根节点,那么就需要分别计算左子树和右子树的种数。左子树有 i-1 个节点,右子树有 n-i 个节点。(比如i = 3(头结点数字是3,结合题干给的图),n = 3, 那么左子树有i-1 = 2个节点,右子树则为0个节点;i= 2,左子树有1个节点,右子树有一个节点;i = 1,左子树有0个节点,右子树有两个节点)
  4. 计算左子树和右子树的种数:根据分步思考,左子树和右子树的种数可以通过之前计算得到,即 dp[i-1] 和 dp[n-i]。
  5. 累加可能性:将左子树和右子树的种数相乘,然后将所有可能的左右子树组合累加起来,即 dp[i] += dp[j-1] * dp[i-j],其中 j 表示根节点的值,从 1 到 i 遍历。
  6. 递推更新数组 dp:从节点数为 1 开始,逐步递推计算 dp 数组,直到节点数为 n,得到最终结果。

具体实现

class Solution {
public:int numTrees(int n) {vector<int> dp;dp.push_back(1); // 初始情况:空树的种数为 1for(int i = 1; i <= n; i++){	dp.push_back(0); // 初始化当前节点数的种数为 0for(int j = 1; j <= i; j++){dp[i] += dp[j-1] * dp[i-j]; // 累加可能性}}return dp[n];}
};

算法分析

  • 时间复杂度:外层循环遍历节点数从 1 到 n,内层循环遍历节点数 j 从 1 到 i,因此总的时间复杂度为 O(n^2)。
  • 空间复杂度:使用了一个大小为 n+1 的数组来存储 dp 值,因此空间复杂度为 O(n)。
  • 动态规划优势:动态规划的优势在于避免了重复计算,通过保存中间结果,将问题分解为子问题,提高了计算效率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/28529.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

qt qml中各种Layout之间是如何对齐的?

问题描述&#xff1a; qt qml中下一个RowLayout如何对齐顶部到上方的ColumnLayout的底部略低一些间隔的位置&#xff1f; 我们怎么使用achors去锚定位置&#xff1f; 这些都是可以用anchors锚定属性&#xff0c;以及margin来设置的。 解决办法&#xff1a; 要实现将下一个R…

使用dockerfile安装各种服务组件

使用dockerfile安装各种服务组件 elasticsearch、minio、mongodb、nacos、redis 一、使用dockerfile安装elasticsearch:7.8.0 1、Dockerfile文件 FROM elasticsearch:7.8.0 #添加分词器 ADD elasticsearch-analysis-ik /usr/share/elasticsearch/plugins/elasticsearch-anal…

喆啡酒店十周年丨啡越时间限,ALL BY 10VE!

啡越时光热爱为伴 十年前&#xff0c;秉持对咖啡馆文化及复古风格的喜爱&#xff0c;喆啡酒店创造全新的Coffetel品类&#xff0c;将充满「温暖」「愉悦」「咖啡香」的格调体验带给消费者&#xff0c;成为无数人「旅途中的啡凡存在」。 十年间&#xff0c;喆啡酒店以热爱化为…

Dev控件 Gridcontrol,gridview 实现多选功能

在网上看了好多实现dev控件GridControl多选功能的方法&#xff0c;都很麻烦&#xff0c;其实GridControl有一个自带的实现多选功能的控件&#xff0c;很简单。 实现效果如下 无需代码代码&#xff0c;使用GridControl中自带的多选功能&#xff0c;在界面直接设置即可 1.找到要…

Redis的安装方法与基本操作

目录 前言 一、REDIS概述 二、REDIS安装 1、编译安装 2.yum安装 三、Redis的目录结构 四、基础命令解析 五、在一台服务器上启动多个redis 六、数据库的基本操作 &#xff08;一&#xff09;登录数据库 &#xff08;二&#xff09;基础命令 七、Redis持久化 &#xff08;一&…

小白编写一个Chrome

步骤 1&#xff1a;了解插件的基本结构和功能 首先&#xff0c;向小白解释什么是Chrome插件&#xff0c;它是如何工作的&#xff0c;以及它可以做什么。强调插件可以修改网页内容、添加功能等。 步骤 2&#xff1a;准备工作 安装Chrome浏览器&#xff1a;确保小白的计算机上…

遇到无法复现的 Bug

当我们在软件开发过程中遇到无法复现的 Bug 时&#xff0c;这可能会让我们感到头疼和困惑。处理这种 Bug 需要一些技巧和方法来帮助我们更好地解决问题。本篇博客将为大家总结一些常用的技术手段和策略&#xff0c;希望能对开发者们在日常工作中遇到类似问题时提供一些帮助。 …

84. 柱状图中最大的矩形

题目描述 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 示例 1: 输入&#xff1a;heights [2,1,5,6,2,3] 输出&#xff1a;10 解释&#xff1a;最…

分立式BUCK电路原理与制作持续更新

一、分立式BUCK电路总体原理图 下面改图包含了电压环和电流环。 二、BUCK电路与LDO的区别 LDO不适合在压差大的环境下使用&#xff0c;因为三极管因为CE极承受了压差&#xff0c;压差越大损耗的功率就越大&#xff0c;将三极管换成MOS管&#xff0c;MOS管两端的压差很小所以效…

什么是行级锁和表级锁

行级锁和表级锁是数据库中常见的两种锁机制&#xff0c;用于在多个事务并发访问数据库时控制数据的访问权限和并发操作。 行级锁&#xff08;Row-Level Locking&#xff09;&#xff1a; 行级锁是指在数据库表中对每一行数据进行锁定&#xff0c;只有被锁定的行才不能被其他事…

【Spring专题】手写简易Spring容器过程分析

前置知识 《【Spring专题】Spring底层核心原理解析》 思路整理 我们在上一节《【Spring专题】Spring底层核心原理解析》课里面有简单分析过一个Spring容器的一般流程&#xff0c;所以&#xff0c;本节课我们这里尝试写一下简易的Spring容器。 手写源码示例 一、手写前的准…

List、Map、Set打印

List List&#xff1a;和数组类似&#xff0c;List可以动态增长&#xff0c;查找元素效率高&#xff0c;插入删除元素效率低&#xff0c;因为会引起其他元素位置改变。 普通[1,2] 1.循环 2.System.out.println(list); int数组[1,2,3,4,5,6,1,2,3] 1.for (int[] array : list)…

【ARM64 常见汇编指令学习 16 -- ARM64 SMC 指令】

文章目录 ARMv8 同步异常同步异常指令SMC TYPE 上篇文章&#xff1a;ARM64 常见汇编指令学习 15 – ARM64 标志位的学习 下篇文章&#xff1a;ARM64 常见汇编指令学习 17 – ARM64 BFI 指令 ARMv8 同步异常 在ARMv8架构中&#xff0c;同步异常主要包括以下几种&#xff1a; Un…

Llama 2:开放基础和微调聊天模型

介绍 大型语言模型(llm)作为高能力的人工智能助手,在复杂的推理任务中表现出色,这些任务需要广泛领域的专家知识,包括编程和创意写作等专业领域。它们可以通过直观的聊天界面与人类进行交互,这在公众中得到了迅速而广泛的采用。 法学硕士的能力是显著的考虑到训练的表面上…

重生之我要学C++第七天(匿名对象、内部类)

构造函数的隐式类型转化 1.单参数构造函数隐式类型转换 来看下面的代码 #include<iostream> using namespace std; class A { public:A(int x){_a x;} private:int _a; }; int main() {A a 3;return 0; } 此处这句代码 A a 3; 对于这里&#xff0c;编译完全正确&…

Mac M1 安装Oracle Java 与 IEDA

文章目录 1 官网下载2 安装IDEA参考 1 官网下载 https://www.oracle.com/ 使用finder中的拖拽进行安装即可 2 安装IDEA https://www.jetbrains.com/zh-cn/idea/download/?sectionmac 同样的&#xff0c;下载完后拖拽安装即可 参考 Mac M1 安装Java 开发环境 https://blog.…

HTML 元素的 class 和 id 属性有何区别?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 唯一性⭐ 选择器权重⭐ JS操作⭐ CSS和JavaScript引用⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击上方或者右侧链接订阅本专栏哦 几何带你启航前端之旅 欢迎来到前端入门之旅&#xff01;这个专栏…

python+vue生成条形码码并展示

需求 最近想做一个小工具&#xff0c;大概要实现这样的效果&#xff1a;后端生成条形码后&#xff0c;不保存到服务器&#xff0c;直接返回给前端展示。 大概思路是&#xff0c;通过 python-barcode库 生成条码的字节流&#xff0c;生成字节流后直接编码成base64格式返回给前…

第四次网安作业

目录 筛选给定时间范围内的日志 时间的表示方法&#xff1a; 时间戳 什么是时间戳&#xff1f; mktime 实例&#xff1a; 执行awk命令 筛选给定时间范围内的日志 时间的表示方法&#xff1a; 时间戳系统时间&#xff08;年月日时间&#xff09; 时间戳 什么是时间…

SpringBoot MDC全局链路解决方案

需求 在访问量较大的分布式系统中&#xff0c;时时刻刻在打印着巨量的日志&#xff0c;当我们需要排查问题时&#xff0c;需要从巨量的日志信息中找到本次排查内容的日志是相对复杂的&#xff0c;那么&#xff0c;如何才能使日志看起来逻辑清晰呢&#xff1f;如果每一次请求都…