​LeetCode刷题实战96:不同的二叉搜索树

【中等】力扣算法题解析LeetCode96:不同的二叉搜索树 本文介绍了计算由n个节点组成的二叉搜索树(BST)数量的动态规划方法。关键思路是将问题分解为子问题:对于每个根节点i,左子树由1到i-1构成,右子树由i+1到n构成,通过累加左右子树的组合数得到结果。递推公式为卡特兰数的形式,即dp[n] = Σ(dp[i-1] * dp[n-i])。算法使用O(n^2)时间和O(n)空间,适用于n≤19的情况。代码实现通过双重循环填充DP数组,最终返回dp[n]作为答案。 阅读详情

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 不同的二叉搜索树,我们先来看题面:

https://leetcode-cn.com/problems/unique-binary-search-trees/

Given n, how many structurally unique BST's (binary search trees) that store values 1 ... n?

题意

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?

样例

解题

递归子问题

假设 n 个节点存在二叉排序树的个数是 G (n),令 f(i) 为以 i 为根的二叉搜索树的个数,则

G(n)=f(1)+f(2)+f(3)+f(4)+...+f(n),

f(i)=G(i−1)∗G(n−i)

class Solution {
    public int numTrees(int n) {
        if (n == 0 || n == 1) return 1;
        int res = 0;
        for (int i = 1; i <= n; i++) {
            res += numTrees(i - 1) * numTrees(n - i);
        }
        return res;
    }
}

动态规划

从dp[0],dp[1]开始逐渐向后扩大

public class Solution {
    public int numTrees(int n) {
        int[] dp = new int[n + 1];
        dp[0] = 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];
    }
}

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode50-80题汇总,速度收藏!

LeetCode刷题实战81:搜索旋转排序数组 II

LeetCode刷题实战82:删除排序链表中的重复元素 II

LeetCode刷题实战83:删除排序链表中的重复元素

LeetCode刷题实战84: 柱状图中最大的矩形

LeetCode刷题实战85:最大矩形

LeetCode刷题实战86:分隔链表

LeetCode刷题实战87:扰乱字符串

LeetCode刷题实战88:合并两个有序数组

LeetCode刷题实战89:格雷编码

LeetCode刷题实战90:子集 II

LeetCode刷题实战91:解码方法

LeetCode刷题实战92:反转链表 II

LeetCode刷题实战93:复原IP地址

LeetCode刷题实战94:二叉树的中序遍历

LeetCode刷题实战95:不同的二叉搜索树 II

分别对无序数组和有序数组建立二叉树,实现遍历和查找 关于二叉树的程序,分别对无序数组和有序数组建立二叉树,实现遍历和查找。 立即下载

相关推荐

深入了解torch框架

大国的游戏,政府支持到位,是未来;AI : Artificial Intelligence,旨在研究、开发能够模拟、延伸和扩展人类智能的理论、方法、技术及应用系统,是一种拥有自主学习和推理能力的技术。它模仿人类大脑某些功能,包括感知、学习、理解、决策和问题解决。AI本质​ NLP(说话,听)、CV(眼睛)、自动驾驶、机器人(肢体动作)、大模型三要素:数据、网络、算力① 神经网络:找到合适的数学公式;② 训练:用已有数据训练网络,目标是求最优解;③ 推理:用模型预测新样本;PyTorch,简称Torch

qq_74732076的博客 1135

关于leetcode刷题详细介绍

  虽然刷题一直饱受诟病,不过不可否认刷题确实能锻炼我们的编程能力,相信每个认真刷题的人都会有体会。现在提供在线编程评测的平台有很多,比较有名的有 hihocoder,LintCode,以及这里我们关注的 LeetCode。 LeetCode收录了许多互联网公司的算法题目,被称为刷题神器,我虽然早有耳闻,不过却一直没有上面玩过。   据了解,LeetCode 是一个非常棒的 OJ(Online J...

智者之家 9万+

IEEE LaTeX模板中algorithm排版避坑指南:如何优雅地嵌入算法描述?

本文详细解析了在IEEE LaTeX模板中优雅排版algorithm的实用技巧,包括基础配置、高级自定义及常见问题解决方案。通过嵌套环境与[H]参数的应用,帮助研究者克服IEEEtran模板对算法排版的限制,实现专业且美观的算法呈现。

weixin_28340315的博客 408

LeetCode算法题整理(200题左右)

Leetcode

qq_38253797的博客 1万+

企业级 Agent 在 K8s 上的运行模型

Kubernetes├── Agent Orchestrator(控制面)├── Agent Runtime Pods(执行面)├── Graph DSL(流程层)├── Tool Services(能力层)K8s(调度)+ Graph(流程)+ Agent(决策)+ Tool(执行)+ Guard(治理)

一起修行,不孤单。这里有编程语言、开发工具、学习方法论和踩坑笔记。用简单的话说复杂的事,陪你从小白到进阶。周更干货,欢迎一起成长! 1172

PyCharm安装PyQt5及工具(Qt Designer、PyUIC、PyRcc)详细教程来了

Qt是常用的用户界面设计工具,而在Python中则使用PyQt这一工具包,它是Python编程语言和Qt库的成功融合。这篇博文通过图文详细介绍在PyCharm中如何完整优雅地安装配置PyQt5的所有工具包,主要内容包括PyQt5、PyQt5-tools的依赖包安装和Qt Designer、PyUIC、PyRcc三个工具的设置。最后简单演示了PyQt5的调用方式及三个工具的使用方法。

Python966的博客 3万+

Leetcode各种题型题目+思路+代码(共176道题及答案)

文章目录 第一章:Leetcode 每日很多题 1、Leetcode-1047 删除字符串中的所有相邻重复项 2、剑指 Offer 53 - I. 在排序数组中查找数字 I 3、Leetcode704:二分查找 4、 Leetcode 227:基本计算器II 5、leetcode 224:基本计算器(带括号的计算) 6、Leetcode 15:三数之和:排序+双指针 7、剑指 offer 38.字符串的排列 8、Leetcode409:最长回文串 9、Leetcode 331:验证二叉树的前序序列化 10、

muli522的博客 4万+

使用TinyProxy搭建代理服务器

背景 办公电脑所在网络无法连接外网,机房服务器可以连接外网,通过服务器代理上网; 一、CentOS下TinyProxy安装–搭建代理服务器 TinyProxy是个轻量级简单的HTTP/HTTPS代理程序,GitHub和官网,安装方式这里主要介绍两种 CentOS下yum安装,参考:TinyProxy安装 Docker安装 先安装docker环境yum install docker -y 二、Win10下使用 ...

椰汁菠萝 1万+

leetcode算法与代码总结

leetcode代码总结1.动态规划问题动态规划思想介绍1. 1.动态规划问题 动态规划思想介绍 1.

一只在cv道路上爬行的小乌龟~ 4180

【AirPlay】苹果认证MFI学习

配件认证是一个过程,通过这个过程,可验证其配件符合MFi技术规范,并通过苹果指定的任何认证测试。MFi门户中的产品计划 "认证 "页面将指导你完成特定配件所需的认证步骤,并指出何时完成所有要求。在完成所有MFi认证要求之前,你不得制造、分发或销售任何配件。在开始MFi认证过程之前,你必须测试你的配件,以确保它符合最新的MFi技术规范,通过产品计划 "测试计划 "上的所有适用测试,并与它将声称具有兼容性的每个苹果设备兼容。

天天的博客 2275

osgEarth 球上显示地形数据库

osgEarth 球上显示地形数据库 本文展示了一种由DSM和DEM得到Osgb工程,并在osgEarth球上显示的方法。其中DSM、DOM到Osgb工程的转换由VPB(VirtualPlanetBuilder)来实现,并采用Model图层将Osgb工程在球上显示。 本文主要解决一下问题: VPB编译 VPB生成地形 地形在球上显示 目录 1 前言 2 VPB编译与使用 3 地形在osgEarth球上显示 内容 1 前言 VirtualPlanetBuilder是一个开源代码工具,用于根据

CPWWHSU的博客 2435

LeetCode的基础入门(非常详细)零基础入门到精通,收藏这一篇就够了

关于LeetCode都需要了解哪些?Python语法reduce(lambda x,y:x * y,ns) # 数组之乘积 (ns[0] * ns[1]) * ns[2]reduce(lambda x,y:x + y,ns) # 数组之和# 记忆化搜索# 大根堆# 过滤函数# 除数# 不可变str 常见函数strip([chars]) # 去除首末两端的字符, 默认是 \r,\n," "replace(old, new[, count]) # 字符串替换, old to new。

Libra1313的博客 4743

把数字化转型真正落到组织里:读懂 SAP 的 OCM 六维框架

摘要: SAP的变革管理框架(OCM)强调数字化转型不仅是技术任务,更需关注组织与人的适应性。OCM包含六大维度:变革战略(明确方向与风险)、变革领导力(统一关键管理者行动)、变革沟通(分层传递信息)、变革实现(细化岗位级影响)、变革赋能(按角色设计培训)和变革有效性(持续评估)。该框架贯穿项目全周期,尤其在云项目中,需从早期规划变革策略,避免后期高代价调整。OCM的核心是将系统设计转化为组织语言,确保业务真正采纳新方式运作。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1433

leetcode数组汇总_LeetCode刷题实战96:不同的二叉搜索树

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !今天和大家聊的问题叫做不同的二叉搜索树,我们先来看题面:https://leetcode-cn.com/problems/unique-binary-search-trees/Given n, how...

weixin_39846364的博客 84

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

leetcode最大矩形_LeetCode刷题实战96:不同的二叉搜索树

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !今天和大家聊的问题叫做不同的二叉搜索树,我们先来看题面:https://leetcode-cn.com/problems/unique-binary-search-trees/Given n, how...

weixin_31688273的博客 106

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

LeetCode第96题_不同的二叉搜索树

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

qq_40263592的博客 2222

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

力扣96-不同的二叉搜索树(Java详细题解)

当只有一个节点时,他的根节点只有为1一种情况,他的左右节点都为dp[0]所以dp[1] = dp[0] * dp[0] = 1。j是指当j为根节点的情况。dp[i - j]就是他的右子树的情况,他的右子树肯定比j大,因为是用j来遍历i,所以他的右子树的节点就是[i - j]了。所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]。dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量。

2302_79761426的博客 2474

力扣第96题 不同的二叉搜索树

设。

weixin_48941116的博客 854

Leetcode 96. 不同的二叉搜索树

Leetcode 96. 不同的二叉搜索树1、问题分析2、问题解决3、总结 1、问题分析 题目链接:https://leetcode-cn.com/problems/unique-binary-search-trees/   可以使用动态规划求解,总体思路就是固定根节点,然后求左右子节点各有多少种情况,将结果相乘,这里注意单位个数为 1。代码我已经进行了详细的注释,理解应该没有问题,读者可以作为参考,如果看不懂(可以多看几遍),欢迎留言哦!我看到会解答一下。 状态转移方程如下: dp[n]={2×dp[0]

珍惜 9047

【JAVA】不同的二叉搜索树——力扣每日一题(三)(2020.07.15)

目录题目:96. 不同的二叉搜索树前置知识二叉搜索树笛卡尔积方法一:动态规划(DP) 题目:96. 不同的二叉搜索树 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2

子浩的博客 3251

C/C++描述 LeetCode 96. 不同的二叉搜索树

C/C++描述 LeetCode 96. 不同的二叉搜索树   大家好,我叫亓官劼(qí guān jié ),在优快云中记录学习的点滴历程,时光荏苒,未来可期,加油~博主目前仅在优快云中写博客,唯一博客更新的地址为:亓官劼的博客 本文原创为亓官劼,请大家支持原创,部分平台一直在恶意盗取博主的文章!!! 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1

一起加油 2115

LeetCode第 96 题:不同的二叉搜索树(C++)

96. 不同的二叉搜索树 - 力扣(LeetCode) 感觉更像是一个公式推导题,具体就直接看题解吧,推导挺简单的:不同的二叉搜索树 - 不同的二叉搜索树 - 力扣(LeetCode) 动态规划 一个重点:注意到 G(n) 代表长为i的序列能构成的二叉搜索树种数,它和序列的内容无关,只和序列的长度有关。 class Solution { public: int numTrees(int n) { vector<int> G(n+1, 0); G[0] =

zj 383

力扣第95题 不同的二叉搜索树 II

给你一个整数 ,要求生成所有由 到 为节点所组成的 不同的二叉搜索树,并返回这些树的根节点。 参数含义 : 当前生成树的节点值范围的起始值。 : 当前生成树的节点值范围的结束值。 : 用于返回生成的树的数量。 返回值 返回所有可能的 BST(以数组形式表示,数组中的每个元素是 BST 的根节点指针)。 当 时,不存在可用节点,这表示一种有效的情况:返回空树。 这种情况允许更高层的递归在左右子树组合时将 作为子树。 枚举每个节点作为根节点: 遍历 范围内的每个数字,将其作为当前树的

weixin_48941116的博客 1402

【力扣刷题实战】验证二叉搜索树

文章目录目录力扣题目:验证二叉搜索树题目描述解题思路问题理解算法选择具体思路解题要点完整代码(C++)兄弟们共勉 !!! 每篇前言原题链接:98. 验证二叉搜索树 - 力扣(LeetCode)给你一个二叉树的根节点 ,判断其是否是一个有效的二叉搜索树。有效 二叉搜索树定义如下:示例 1: 输入:root = [2,1,3] 输出:true 示例 2: 输入:root = [5,1,4,null,null,3,6] 输出:false 解释:根节点的值是 5 ,但是右子节点的值是 4 。 解题思路 问

2401_85548793的博客 1143

你有多久没有坚持过一件事情了?如果没有就来刷一轮力扣LeetCode

选择一样你想做的事情,坚持21天。如果没有想好,那就先来刷一轮力扣吧!~

车手只需要车和手,压力来自轮胎 1360

LeetCode Java面试刷题笔记汇总

LeetCode Java刷题笔记汇总,按照类型刷题效率更高。

终生学习践行者 2948
上一篇: Windows10系统变慢,用上这19招,电脑性能大幅度提升!
下一篇: 全网最全Log配置教程及框架性能比较,看这篇就够了!
编程IT圈
博客等级 码龄6年 1130粉丝 544原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

编程IT圈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值