leetcode必刷题 96.不同的二叉搜索树

一、问题描述:

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

二、解题思路:

二叉树是由根节点,左右子树组成的,二叉搜索树要满足左子树的所有元素都小于根节点,右子树的所有节点大于根节点。
这样就可以把一个问题划分为多个小问题(在根节点确定的时候,左右子树共有多少种情况),符合动态规划的思想。
假设共有 n 个节点,让 n 个节点依次轮流充当根节点,找到此时左右子树可能的排列情况,结果就是累加起来的和。

三、图解分析

  1. n=1 和 n=2 时:
    不难看出一个节点时,只有一种情况。
    两个节点时,以1为根节点,左子树为空。以2为根节点,右子树为空,共有两种情况。
    n=1和2时的情况
  2. 以此类推,n=3 时有:
    ①以1为根节点,左子树为空,右子树有两个节点,所以共有2种情况。
    ②以2为根节点,左子树有一个节点,右子树有一个节点,所以共有1种情况。
    ③以3为根节点,左子树有两个节点,右子树为空,所以共有2种情况。
    共有5种情况。
    n = 3时的五种情况

四、代码实现

//时间复杂度为 O(n^2)
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 = 1; j <= i; j++){dp[i] += dp[i - j] * dp[j - 1];}}//for(int num : dp) System.out.println(num);//打印dp数组看一看与递推的结果是否一致return dp[n];}
}
  • 时间复杂度分析:外层循环需要遍历 n 次,内层循环每次需要遍历最多 i 次。因此,总体时间复杂度为 O(n^2)。

五、补充

  • 动态规划详解
    ①dp数组以及下标的含义:
    定义dp数组初始化长度为 n+1。dp[i] 表示 i 个节点可以组成 dp[i] 种二叉搜索树。
    ②递推公式:
    dp[i] += dp[j - 1] * dp[i - j];
    j 相当于是头结点的元素,从1遍历到 i 为止。
    j-1 为 j 为头结点左子树节点数量,i - j 为以 j 为头结点右子树节点数量。
    ③dp数组初始化
    dp[0] = 1。也可以加上dp[1] = 1;
    虽然题目写了n > 0,但是二叉树的左右子树可能是空的,dp[0]不能写成0,否则结果都变成0了,为空时也当成是一种排列方式。
    ④确定遍历顺序
    n 个节点的结果dp[n]要依赖 dp[1] ~ dp[i] 的值,所以先遍历 1 ~ n 里面每一个数作为头结点的状态,用 i 来遍历。
    根据递推公式dp[i] += dp[j - 1] * dp[i - j],节点数为 i 的 dp[i] 是依靠 i 之前节点数的状态。所以第二层遍历 1 ~ i 里面每一个数作为头结点的状态,用 j 来遍历。简单带入 n = 3的情况,递推公式的结果与图中的推论是一致的。
    ⑤核心代码如下:
for (int i = 1; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[j - 1] * dp[i - j];}
}

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

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

相关文章

提高驾驶安全性 | 基于ACM32 MCU的胎压监测仪方案

概述 胎压监测系统 作为车辆的基础部件&#xff0c;轮胎是影响行车安全不可忽视的因素之一。据统计&#xff0c;中国每年由胎压问题引起轮胎爆炸的交通事故约占 30%&#xff0c;其中 50%的高速交通事故是由车辆胎压异常引起。因此&#xff0c;准确实时地监测车辆在行驶过程中…

Java虚拟机(JVM)元数据区存放的内容

类元数据 元数据区&#xff08;在HotSpot虚拟机中也称为Metaspace&#xff09;主要存放了类的元数据信息&#xff0c;如类的名称、访问修饰符、常量池、字段描述、方法描述等。 运行时常量池 运行时常量池是每个类或接口的常量池表的运行时表示形式&#xff0c;包含了若干种不…

Curriculum Manager for Source Selection in Multi-Source Domain Adaptation

GRL: gradient reversal layer&#xff0c;CM: Curriculum Manager 辅助信息 作者未提供代码

PokéLLMon 源码解析(四)

.\PokeLLMon\poke_env\exceptions.py """ This module contains exceptions. """# 定义一个自定义异常类 ShowdownException&#xff0c;继承自内置异常类 Exception class ShowdownException(Exception):"""This exception is …

openssl3.2 - exp - generate prime

文章目录 openssl3.2 - exp - generate prime概述笔记END openssl3.2 - exp - generate prime 概述 openssl3.2.命令行可以生成质数 openssl prime -generate -bits 256 -hex -safe 单步调试openssl.exe工程, 整理了一个函数, 用openssl API来产生质数. openssl命令行是将结果…

2024/3/10打卡借教室——二分+差分

题目 在大学期间&#xff0c;经常需要租借教室。 大到院系举办活动&#xff0c;小到学习小组自习讨论&#xff0c;都需要向学校申请借教室。 教室的大小功能不同&#xff0c;借教室人的身份不同&#xff0c;借教室的手续也不一样。  面对海量租借教室的信息&#xff0c;我们自…

IDEA打开项目文件目录不见了

偶尔发生新拉下来的代码&#xff0c;或者旧代码修改了包名&#xff0c;项目名称等&#xff0c;idea左侧project一栏不显示代码的文件目录。例如下面此时不要慌张&#xff0c;不用删除项目重新拉取&#xff0c;通过以下方式解决&#xff1a; 本人尝试能够解决&#xff0c;如果无…

c# 二分查找(迭代与递归)

二分搜索被定义为一种在排序数组中使用的搜索算法&#xff0c;通过重复将搜索间隔一分为二。二分查找的思想是利用数组已排序的信息&#xff0c;将时间复杂度降低到O(log N)。 二分查找算法示例 何时在数据结构中应用二分查找的条件&#xff1a; 应用二分查找算法&#xff1a…

stable diffusion faceswaplab换脸插件报错解决

错误提示&#xff1a; ERROR - Failed to swap face in postprocess method : apply_overlay() takes 3 positional arguments but 4 were given 打开插件对应目录&#xff1a; \sd-webui-aki-v4.6.1\extensions\sd-webui-faceswaplab\scripts\faceswaplab_utils中 imgutil…

架构:Apache Kafka Connect实现sqlserver数据实时同步

实现Apache Kafka Connect与SQL Server之间的实时数据同步&#xff0c;您可以使用Kafka Connect的JDBC Source Connector。以下是一个基本的步骤&#xff1a; 1. 安装Kafka Connect&#xff1a;确保您已经安装了Apache Kafka 和 Kafka Connect。您可以从Apache Kafka的官方网站…

Servlet API 详细讲解

Servlet API 详细讲解 API就是一组类和方法的集合&#xff0c;servlet 中的 类是非常多的&#xff0c;咱们只需要学习 3个类即可。 HttpServletHttpServletRequest&#xff08;服务器如何读取客户端响应&#xff09;HttpServletResponse&#xff08;服务器如何把响应返回给客…

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4

【ros2 control 机器人驱动开发】双关节多控制器机器人学习-example 4 文章目录 前言一、创建controller相关二、测试运行测试forward_position_controller总结前言 本篇文章在上篇文章的基础上主要讲解双轴机器人驱动怎么编写机器人外部/内部(扭矩、压力)传感器数据反馈1,…

delphi7中出现“无法更改以命令对象为源的记录集对象..“的错误解决

我在delphi7环境下写一个数据库应用程序&#xff0c;每次关闭界面时总出现“无法更改以命令对象为源的记录集对象.."的错误。如图所示。 经查阅资料&#xff0c;我得到一些思路&#xff1a;最 这个错误信息通常表示在关闭窗体时&#xff0c;有一个或多个数据库组件&…

大数据开发(Hadoop面试真题-卷四)

大数据开发&#xff08;Hadoop面试真题&#xff09; 1、Hadoop小文件处理问题&#xff1f;2、介绍下HDFS&#xff0c;说下HDFS优缺点&#xff0c;以及使用场景&#xff1f;3、HDFS作用4、HDFS的容错机制5、HDFS的副本机制6、HDFS的常见数据格式&#xff0c;列式存储格式和行存储…

Uniapp开发模板unibest

&#x1f3e0;简介 unibest 是一个集成了多种工具和技术的 uniapp 开发模板&#xff0c;由 uniapp Vue3 Ts Vite4 UnoCss uv-ui VSCode 构建&#xff0c;模板具有代码提示、自动格式化、统一配置、代码片段等功能&#xff0c;并内置了许多常用的基本组件和基本功能&#…

软件安全——堆栈基础知识点总结

一、堆栈基础——内存区域 1、内存区域相关概念 内存区域&#xff1a;一个进程可能被分配到不同的内存区域去执行&#xff1a; 代码区&#xff1a;这个区域存储着被装入执行的二进制机器代码&#xff0c;处理器会到这个区域取指并执行。 数据区&#xff1a;用于存储全局变量…

重拾C++之菜鸟刷算法第10篇---二叉树(下)

十五、合并二叉树 题目 给你两棵二叉树&#xff1a; root1 和 root2 。 想象一下&#xff0c;当你将其中一棵覆盖到另一棵之上时&#xff0c;两棵树上的一些节点将会重叠&#xff08;而另一些不会&#xff09;。你需要将这两棵树合并成一棵新二叉树。合并的规则是&#xff1…

【NR 定位】3GPP NR Positioning 5G定位标准解读(八)- OTDOA定位

前言 3GPP NR Positioning 5G定位标准&#xff1a;3GPP TS 38.305 V18 3GPP 标准网址&#xff1a;Directory Listing /ftp/ 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;一&#xff09;-CSDN博客 【NR 定位】3GPP NR Positioning 5G定位标准解读&#xff08;…

车规芯片为什么需要信息安全(1)

目录 1.汽车出现过被黑客攻击事件吗&#xff1f; 2.汽车信息安全标准汇总 2.1 国际标准 2.2 国内标准 3.车规芯片的信息安全应该从什么地方考虑 3.1 芯片硬件安全防护能力 3.2 车规芯片的信息安全服务 3.3 芯片厂如何证明芯片的信息安全能力 4.小结 这个来自家里人的灵…

WebGL之创建 3D 对象

现在让我们给之前的正方形添加五个面从而可以创建一个三维的立方体。最简单的方式就是通过调用方法 gl.drawElements() 使用顶点数组列表来替换之前的通过方法gl.drawArrays() 直接使用顶点数组。而顶点数组列表里保存着将会被引用到一个个独立的顶点。 其实现在会存在这样一个…