LeetCode题练习与总结:不同的二叉搜索树--96

一、题目描述

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

二、解题思路

这个问题是关于卡特兰数的经典问题。二叉搜索树(BST)的一个重要特性是,它的中序遍历结果是一个有序数组。因此,如果我们有 n 个互不相同的节点,那么可能的二叉搜索树的种数与这些节点的排列方式有关。

对于给定的 n,我们可以这样考虑:

  1. 选择 1 作为根节点,那么剩下的 n-1 个节点将位于根节点的右侧,可以形成 G(n-1) 种 BST。
  2. 选择 2 作为根节点,那么剩下的 n-2 个节点中,1 个位于根节点的左侧,n-3 个位于根节点的右侧,可以形成 G(1) * G(n-3) 种 BST。
  3. 以此类推,直到选择 n 作为根节点,剩下的 n-1 个节点将位于根节点的左侧,可以形成 G(n-1) 种 BST。

因此,G(n) 可以用以下公式表示:G(n)=G(0)∗G(n−1)+G(1)∗G(n−2)+...+G(n−1)∗G(0)

其中 G(0) = 1,因为只有一个节点的 BST 只有一种情况。

基于上述思路,我们可以用动态规划的方法来解决这个问题。我们可以创建一个数组 dp,其中 dp[i] 表示有 i 个节点时可能的 BST 种数。然后我们可以按照上述公式计算 dp 数组。

三、具体代码

public class Solution {public int numTrees(int n) {if (n == 0) return 1;int[] dp = new int[n+1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[j-1] * dp[i-j];}}return dp[n];}
}

四、时间复杂度和空间复杂度

1. 时间复杂度
  • 我们有一个双重循环结构。外层循环遍历从 2 到 n 的所有整数,共执行 n - 1 次。
  • 内层循环遍历从 1 到当前外层循环的整数,最坏情况下(即外层循环变量为 n 时)执行 n 次。
  • 因此,内层循环总共执行次数为 1 + 2 + … + n,这是一个等差数列求和,其和为 (n * (n + 1)) / 2。
  • 所以,总的时间复杂度为 O((n * (n + 1)) / 2),简化后为 O(n^2)。
2. 空间复杂度
  • 我们使用了一个大小为 n+1 的数组 dp 来存储中间结果。
  • 因此,空间复杂度是 O(n),即与输入大小 n 成正比。

综上所述,代码的时间复杂度是 O(n^2),空间复杂度是 O(n)。

五、总结知识点

  1. 动态规划(Dynamic Programming, DP):这是一种用于解决优化问题的算法思想,它将复杂问题分解为多个子问题,通过解决子问题来构建原问题的解。动态规划通常用于解决具有重叠子问题和最优子结构特性的问题。

  2. 二叉搜索树(Binary Search Tree, BST):这是一种特殊的二叉树,其中每个节点都满足左子树中的所有元素小于该节点的值,右子树中的所有元素大于该节点的值。题目要求计算不同结构的BST的数量。

  3. 卡特兰数(Catalan number):这是一个组合数学中的数列,用于计算不同结构的二叉树的数量。第 n 个卡特兰数可以通过公式 C(n) = (2n)! / ((n+1)! * n!) 计算得出,其中 n! 表示 n 的阶乘。

  4. 循环结构:代码中使用了两个嵌套的 for 循环,这是一种常见的控制结构,用于重复执行代码块固定的次数。

  5. 数组的使用:代码中使用了一个整数数组 dp 来存储中间结果,这是一种常见的数据结构,用于存储多个相同类型的数据项。

  6. 累加操作:在动态规划的过程中,通过累加操作计算 dp 数组的值,这是动态规划中更新状态的一种常见方式。

  7. 边界条件处理:代码中对于 n=0 和 n=1 的情况进行了特殊处理,这是因为在这些情况下,BST 的数量是确定的,分别为 1。

以上就是解决这个问题的详细步骤,希望能够为各位提供启发和帮助。

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

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

相关文章

yolov8添加FPPI评价指标

这里写自定义目录标题 yolov8 中FPPI实现测试中调用 效果结语 续yolov7添加FPPI评价指标 。之前在yolov7中增加了fppi指标&#xff0c;有不少网友问有没有yolov8中增加&#xff0c;最近没有做算法训练&#xff0c;也一直没时间弄。这几天晚上抽了点时间&#xff0c;弄了一下。不…

WD—C++课前作业—30题

怎么会手和脚都在桌子上 目录 31&#xff0c;声明一个类 String,其数据成员为 char head[100],构造函数 String(char*Head)实现 head 的初始化&#xff0c;成员函数 void reverse()实现 head 内字符串的逆序存放&#xff0c;成员函数 void print()实现 head 内字符串的输出。…

tensorflow实现二分类

# 导入所需库和模块 from tensorflow.keras.layers import Dense, Input, Activation # 导入神经网络层和激活函数模块 from tensorflow.keras.models import Sequential # 导入Keras的Sequential模型 import pandas as pd # 导入Pandas库用于数据处理 import numpy as np …

TreeMap详解:Java 有序 Map 原理与实现

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

银河麒麟V10操作系统编译LLVM18踩坑记录

1、简述 要在银河麒麟V10操作系统上编译一个LLVM18&#xff0c;这个系统之前确实也没有用过&#xff0c;所以开始了一系列的摸排工作&#xff0c;进行一下记录。 首先肯定是要搞一个系统&#xff0c;所以去到银河麒麟的网站&#xff0c;填写了一个申请 产品试用申请国产操作系…

3dmax材质库导入方法?3dmax云渲染速度体验

3ds Max 材质库包含多种素材&#xff0c;如金属、木材、布料和石材等&#xff0c;但用户在导入材质时常遇到问题。本文将介绍如何在3ds Max中成功导入材质&#xff0c;并探讨使用云渲染服务来加速渲染过程&#xff0c;提高项目效率。 一、3dmax材质库导入教程 自建材质导入方法…

第1章 初始Spring Boot【仿牛客网社区论坛项目】

第1章 初始Spring Boot【仿牛客网社区论坛项目】 前言推荐项目总结第1章初识Spring Boot&#xff0c;开发社区首页1.课程介绍2.搭建开发环境3.Spring入门体验IOC容器体验Bean的生命周期体验配置类体验依赖注入体验三层架构 4.SpringMVC入门配置体验响应数据体验响应Get请求体验…

如何利用3D可视化大屏提升信息展示效果?

老子云3D可视化平台https://www.laozicloud.com/ 引言 在信息爆炸的时代&#xff0c;如何有效地传达和展示信息成为了各行各业的一大挑战。传统的平面展示方式已经无法满足人们对信息展示的需求&#xff0c;3D可视化大屏应运而生&#xff0c;成为了提升信息展示效果的利器。本…

JavaScript异步编程——10-async异步函数【万字长文,感谢支持】

异步函数&#xff08;用 async 声明的函数&#xff09; 异步函数的定义 使用async关键字声明的函数&#xff0c;称之为异步函数。在普通函数前面加上 async 关键字&#xff0c;就成了异步函数。语法举例&#xff1a; // 写法1&#xff1a;函数声明的写法async function foo1(…

Centos 6.10 安装oracle10.2.0.1

由于阿里云机房要下架旧服务器&#xff0c;单位未购买整机迁移服务&#xff0c;且业务较老不兼容Oracle11g&#xff0c;所以新购买一台新服务器进行安装Oracle10.2.0.1 &#xff0c;后续再将数据迁移到新服务器上。 对外ip 内部ip 数据库版本 操作系统版本 实例名 源库 1…

风电功率预测 | 基于PSO-BP神经网络实现风电功率预测(附matlab完整源码)

风电功率预测 风电功率预测完整代码风电功率预测 基于粒子群优化算法(Particle Swarm Optimization, PSO)的BP神经网络是一种常见的方法,用于实现风电功率预测。下面是一个基于PSO-BP神经网络实现风电功率预测的一般步骤: 数据准备:收集与风电场发电功率相关的数据,包括…

sd卡修复方法

如何修复损坏或损坏的SanDisk设备 1.使用命令提示符修复损坏的SanDisk SD卡 按“Windows”按钮&#xff0c;键入“command”并按Enter键现在&#xff0c;使用文件资源管理器窗口中的垂直三个菜单选择“此设备”&#xff0c;查看存储卡字母切换到命令提示符窗口并键入“chkdsk”…