力扣第96题 不同的二叉搜索树 c++ 二叉搜索树 动态规划 + 数学思维

news2024/11/25 15:41:11

题目

96. 不同的二叉搜索树

中等

相关标签

树   二叉搜索树   数学   动态规划   二叉树

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

思路和解题方法 一 动态规划

  1. vector<int> dp(n + 1);:创建一个名为 dp 的整数向量,长度为 n+1。dp[i] 表示节点数量为 i 时的二叉搜索树数量。

  2. dp[0] = 1;:将 dp[0] 初始化为 1,因为当节点数量为 0 时,只有一种情况,即空树。

  3. for (int i = 1; i <= n; i++):遍历节点数量从 1 到 n 的所有情况。

  4. for (int j = 1; j <= i; j++):对于当前节点数量 i,遍历 j 从 1 到 i 的所有情况,表示以 j 作为根节点的情况。

  5. dp[i] += dp[j - 1] * dp[i - j];:计算以 j 作为根节点时,左子树和右子树的组合数,并将其累加到 dp[i] 中。dp[j - 1] 表示左子树的组合数,dp[i - j] 表示右子树的组合数。

  6. 最终返回 dp[n],即节点数量为 n 时的二叉搜索树数量。

复杂度

        时间复杂度:

                O(n^2)

时间复杂度为 O(n^2),因为有两个嵌套的循环。

        空间复杂度

                O(n)

空间复杂度为 O(n),因为使用了一个长度为 n+1 的向量来保存中间结果。

c++ 代码一

class Solution {
public:
    int numTrees(int n) {
        // 创建一个长度为n+1的vector,用于存储不同数值的二叉搜索树的数量
        vector<int> dp(n + 1);
        // 初始化dp[0]为1,因为空二叉树也算一棵二叉树
        dp[0] = 1;
        // 循环计算dp数组中每个元素的值
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                // 根据公式计算dp[i]的值,即左子树数量×右子树数量之和
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        // 返回dp[n],即n个节点的不同数值的二叉搜索树的数量
        return dp[n];
    }
};

思路和解题方法 二 数学思维

代码中,使用了一个变量C来表示二叉搜索树的数量。初始时,将C设置为1。

然后通过循环遍历i从0到n-1的所有情况,进行如下操作:

  1. 将C乘以2 * (2 * i + 1)。这一步是为了计算当前节点数量为i+1时,左子树的组合数。因为左子树的节点数量比根节点小,所以乘以2 * (2 * i + 1)可以得到左子树的组合数。

  2. 将C除以(i + 2)。这一步是为了计算右子树的组合数。右子树的节点数量比根节点大,所以除以(i + 2)可以得到右子树的组合数。

通过每次循环更新C的值,最终得到的C即为n个节点的二叉搜索树的数量。

这段代码利用了组合数的性质,将计算二叉搜索树数量的问题转化为了求解组合数的问题。

通过不断更新C的值,可以高效地计算出给定节点数量的二叉搜索树的数量。

需要注意的是,由于C的值可能非常大,所以在返回结果之前,将C强制转换为int类型。

复杂度

        时间复杂度:

                O(n)

时间复杂度分析: 代码中的循环从0到n-1遍历,每次循环都执行一些基本的数学运算,包括乘法、除法和加法。这些运算的时间复杂度都是常数级别的。因此,整个循环的时间复杂度为O(n)。

        空间复杂度

                O(1)

空间复杂度分析: 代码中只使用了一个变量C来存储二叉搜索树的数量,而且在整个过程中不需要额外的数据结构来存储中间结果。因此,空间复杂度为O(1),即常数级别的空间消耗。

c++ 代码二

class Solution {
public:
    int numTrees(int n) {
        long long C = 1; // 初始化组合数C为1,用于存储二叉搜索树的数量
        for (int i = 0; i < n; ++i) { // 循环计算每个节点数量的二叉搜索树的数量
            C = C * 2 * (2 * i + 1) / (i + 2); // 计算组合数C的值
        }
        return (int)C; // 将组合数C强制转换为int类型并返回
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。

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

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

相关文章

NoSQL数据库使用场景以及架构介绍

文章目录 一. 什么是NoSQL&#xff1f;二. NoSQL分类三. NoSQL与关系数据库有什么区别四. NoSQL主要优势和缺点五. NoSQL体系框架 其它相关推荐&#xff1a; 系统架构之微服务架构 系统架构设计之微内核架构 鸿蒙操作系统架构 架构设计之大数据架构&#xff08;Lambda架构、Kap…

Halo勒索病毒:了解最新变种.halo,以及如何保护您的数据

导言&#xff1a; 在当今数字化的世界中&#xff0c;网络威胁不断演变&#xff0c;其中勒索病毒一直是网络犯罪分子的有力武器之一。在这篇文章中&#xff0c;我们将深入介绍.halo勒索病毒&#xff0c;了解它的工作方式&#xff0c;讨论如何恢复被加密的数据文件&#xff0c;并…

【网络协议】聊聊HTTPS协议

前面的文章&#xff0c;我们描述了网络是怎样进行传输数据包的&#xff0c;但是网络是不安全的&#xff0c;对于这种流量门户网站其实还好&#xff0c;对于支付类场景其实容易将数据泄漏&#xff0c;所以安全的方式是通过加密&#xff0c;加密方式主要是对称加密和非对称加密。…

vue3简单写导航anchor示例(支持点击高亮和滚动判断高亮)

1. 点击anchor, 相应的anchorlink高亮 function anchorClick(index) { forceStop.value true; time Date.now(); wheelRef.value.children[index].scrollIntoView({ block: start, behavior: smooth }); // 给一些延时, 再点亮anchor, 同时不再限制scrol…

【教3妹学编辑-算法题】环和杆

3妹&#xff1a;2哥&#xff0c;今年春节的放假安排出来了&#xff0c;今年春节放8天假&#xff0c;我们公司除夕提前放一天&#xff0c;总共9天假。 耶~~~ 2哥 :你们公司这么好啊&#xff0c; 我们公司的放假安排还没出来&#xff0c;不知道今年除夕能不能回家了… 3妹&#x…

(免费领源码)Java#MYSQL超市管理系统10428-计算机毕业设计项目选题推荐

目 录 摘要 1 绪论 1.1 研究意义 1.2国内外研究现状 1.3论文结构与章节安排 2 超市管理系统系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析 2.5本章小结 3 …

openGauss-向量化执行引擎-VecUnique算子

openGauss-向量化执行引擎系列-VecUnique算子 openGauss实现了向量化执行引擎&#xff0c;达到算子级别的并行。也就是说在执行器火山模型基础上&#xff0c;一次处理一批数据&#xff0c;而不是一次一个元组。这样可以充分利用SIMD指令进行优化&#xff0c;达到指令级别并行。…

知识点滴 - 纸张的大小

关于纸张大小的描述方法 纸张大小的描述方法主要有两种&#xff0c;一种是我们经常使用的打印纸使用的A4、A3的叫法&#xff0c;这个是国际标准。 另一种是开本的叫法&#xff0c;比如16开、32开等。开本常见于书籍印刷品的规格。正规出版物基本没有使用 A4&#xff08;ISO国际…

1688阿里巴巴官方开放平台API接口获取跨境属性、跨境包裹重量、单位重量等参数调用示例说明

1688.item_get_specifications-获得跨境属性 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09;注册调用key接入secretString是调用密钥api_nameString是API接口名称&#xff08;包括在请求地址中&#xff09;[item_search,item_…

2023SHCTF web方向wp

1.ezphp 看一眼&#xff0c;你大爷&#xff0c;啥玩意都给我过滤完了。 还好下面有preg_replace()/e&#xff0c;会把replacement当作php语句执行 传参pattern.*&#xff0c; .*表示任意字符&#xff0c;code{${phpinfo()}} &#xff0c;为什么这样写&#xff0c;因为,print_…

CHS零壹视频恢复程序高级版视频修复OCR使用方法

目前CHS零壹视频恢复程序监控版、专业版、高级版已经支持了OCR&#xff0c;OCR是一种光学识别系统&#xff0c;高级版最新版本中不仅仅是在视频恢复中支持OCR&#xff0c;同时视频修复模块也增加了OCR功能&#xff0c;此功能可以针对一些批量修复的视频文件&#xff08;如执法仪…

网络编程---Socket

文章目录 网络编程基础什么是网络编程&#xff1f;网络编程的基本概念 网络编程实现Socket套接字UDP网络通信流程&#xff08;回显服务器&#xff09;服务器&#xff1a;客户端完整代码示例&#xff1a; TCP网络通信流程&#xff08;回显服务器&#xff09;服务器客户端完整的代…

医保经办系统练兵比武竞赛中用到的软件和硬件

全国医保经办系统练兵比武竞赛包括必答题、抢答题、案例题、实操题、风险题&#xff0c;用到选手端平板、评委端平板、主持人平板、抢答器等设备。分别计算团队分和个人分。答题规则和计分方案均较为复杂&#xff0c;一般竞赛软件无法实现&#xff0c;要用到高端竞赛软件&#…

谷歌动态搜索广告被滥用引发恶意软件泛滥

研究人员发现了一种新方法&#xff0c;可以利用易受攻击的网站向搜索引擎用户发送恶意的、有针对性的广告&#xff0c;这种方法能够传播大量恶意软件&#xff0c;使受害者完全不知所措。 关键是“动态搜索广告”&#xff0c;谷歌利用网站登陆页面的内容将目标广告与搜索配对的…

Kubernetes 高级调度 - Affinity

Author&#xff1a;rab 目录 前言一、Node 亲和性1.1 NodeAffinity1.1.1 Hard Node Affinity1.1.2 Soft Node Affinity 1.2 NodeAntiAffinity 二、Pod 亲和性2.1 PodAffinity2.1.1 Hard Pod Affinity2.1.2 Soft Pod Affinity 2.2 PodAntiAffinity 总结 前言 Kubernetes 中的 A…

OceanBase:02-单机部署(生产环境)

目录 一、部署规划 二、配置要求 三、部署前配置 1.配置 limits.conf 2.配置 sysctl.conf 3.关闭防火墙 4.关闭 SELinux 5.创建数据目录&#xff0c;修改文件所有者信息 6.设置无密码 SSH 登录 7.安装jdk 四、解压执行安装 五、OBD命令行部署 1.修改配置文件(all-c…

网络质量探测

目录 一.BFD监测网络状态 二. NQA检测网络状态 一.BFD监测网络状态 BFD(BidrectionaL Forwarding Detection 双向转发检测)用于快速检测系统设备之间的发送和接受两个方向的通信故障&#xff0c;并在出现故障时通知生成应用。BFD 广泛用于链路故障检测&#xff0c;并能实现与…

探究Java虚拟机运行时数据区,了解方法区的奥秘

目录 一、栈、堆、方法区交互关系 二、方法区的理解 三、HotSpot中方法区的演进 四、设置方法区大小与OOM 五、如何解决OOM 六、方法区的内部结构 &#xff08;一&#xff09;类型变量 &#xff08;二&#xff09;域信息 &#xff08;三&#xff09;方法信息 &#x…

AN动画基础——遮罩动画

【AN动画基础——遮罩动画】 什么是遮罩动画基本使用方法实战&#xff1a;水墨遮罩 本篇内容&#xff1a;了解遮罩动画 重点内容&#xff1a;遮罩动画应用 工 具&#xff1a;Adobe Animate 2022 什么是遮罩动画 遮罩动画是一种常见的图形效果&#xff0c;利用遮罩层来实现元素…

ARPG----C++学习记录02 Section6位置,偏移,函数

设置actor位置 这一句代码就可以更改位置和旋转 给位置添加偏移offset 将debug的持久都设置为false,在tick中调用&#xff0c;球就会动。这是每帧移动&#xff0c;所以移动速度和帧率有关&#xff0c;需要更改 void Aitem::Tick(float DeltaTime) {Super::Tick(DeltaTime);Ad…