【leetcode】96. 不同的二叉搜索树(动态规划)

LeetCode96不同的二叉搜索树(动态规划) 算法特点及适用场景该算法基于动态规划思想,通过合理定义状态和推导状态转移方程,巧妙地解决了计算不同二叉搜索树数量的问题。代码实现较为简洁直观,易于理解和实现,通过逐步累加不同根节点选择下的子树组合情况来得到最终结果。适用于类似具有组合计数、根据子结构情况递推整体结构数量等特点的问题,比如在一些树形结构相关的计数问题、特定规则下的排列组合问题等场景中,如果能抽象出类似的子结构与整体结构的递推关系,都可以尝试运用这种动态规划的思路来求解。注意事项及可能遇到的问题。 阅读详情

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

示例:

输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:

在这里插入图片描述


分析:
可以转换成数学公式来解。
12345…理解为一个数组,其中的每个节点都可以拎起来,当做根节点。
故,可以划分为左子树有i-1个节点,右子树有n-1个节点。(其中一个位根节点)

递归写法,必定超时。用hash表存一下也不行。

// 还是超时
int numTreesImpl(int n, unordered_map<int, int>& hash)
{
	if (n == 1 || n == 0) return 1;


	int res = 0;
	for (int i = 0; i < n; i++)
	{
		int left = 0;
		int right = 0;
		if (hash.find(i) != hash.end())
		{
			left = hash.find(i)->second;
		}
		else
		{
			left = numTreesImpl(i, hash);
		}

		if (hash.find(n - i - 1) != hash.end())
		{
			right = hash.find(n - i - 1)->second;
		}
		else
		{
			right = numTreesImpl(n - i - 1, hash);
		}

		res += left * right;
	}
	return res;
}

// https://leetcode-cn.com/problems/unique-binary-search-trees/
// 给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
// 超时递归
int numTrees(int n) { 
	unordered_map<int, int> hash;
	return numTreesImpl(n, hash);
}

然后用动态规划的思想来解这个问题。
用一个dp[n+1]的数组保存自底向上计算出来的子结果。其中当前节点dp[i]的值,可以表示为
dp[i] += dp[j - 1] * dp[i - j]
其中j从1到i。是一个累加的和

int numTrees(int n) {
	vector<int> dp(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];
}
SAP 物料的分割评估 SAP 物料的分割评估 前言 本文主要讲解SAP中物料的分割评估,通过分割评估来区分出同一物料不同来源下的核算方式。例如:同一物料分为自产或者采购,或者同一物料分为进口或者国内采购等。 一、概述 分割评估一般用于以下场景: 1、物料分为内部采购和外部采购; 2、物料分属于进口或者国内采购; 3、物料分属于不同的批次; 4、物料分为自制或者采购。 由于物料的来源不同可能导致物料的价格或者性质不同,需要用不同价格来区分出 二、配置步骤 1.激活分割评估 ... 阅读详情

相关推荐

pgpool-II踩坑日记两则

最近结合pgpool-II进行postgreSQL高可用的部署,过程非常煎熬,作为新手,公司也没有前辈熟悉postgreSQL,只能自己摸索。好在已经搞明白了,把困扰我很长时间的两个问题分享一下。 1. show pool_nodes 第一个问题就是 show pool_nodes 的使用,照着教程建好后,在哪里执行这个指令呢?我在pg服务器上怎么执行这个指令都显示 ERROR: unrecognized configuration parameter "pool_nodes",一度怀疑人生。翻阅了很多资料

zhaizhai6_6的博客 4540

动态规划之不同的二叉查找树

不同的二叉查找树 给出 n,问由 1…n 为节点组成的不同的二叉查找树有多少种? 样例 1: 输入: n = 3 输出: 5 解释: 有5种不同形态的二叉查找树 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / / \ \ 2 1

Zero丶的专栏 1468

虚拟机扩容——非LVM分区

虚拟机扩容——非LVM分区

ytraister的博客 3905

搜索树基础:二叉搜索树(详解特性用途,图解实现过程)

有兴趣学数据结构了吗?

LEE180501的博客 3223

软件测试工程师最常用的Linux系统命令大全(汇总)

cd命令这是一个非常基本,也是大家经常需要使用的命令,它用于切换当前目录,它的参数是要切换到的目录的路径,可以是绝对路径,也可以是相对路径。

1330

Rockchip rv1126平台在gstreamer1中添加OpenCv实现视频流负片的效果

rv1126 gstreamer opencv negetive effect

Aisy_D的专栏 1463

5.不同的二叉搜索树

给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 ...

一条咸鱼的博客 839

IntelliJ IDEA 中git使用说明书

IntelliJ IDEA 中git使用说明书

junyang2012的博客 5389

二叉树详解

1.二叉树的概念 1.1二叉树的定义 二叉树是另一种树形结构,其特点是每个结点至多只有两棵子树(即不存在度大于2的结点),二叉树有左右之分,其次序不能任意颠倒。 图1.1 左右子树有顺序 ...

adong6561975的博客 3554

【论文复现】——基于LM优化的NDT点云配准算法

传统的正态分布变换配准算法处理初始位姿变换相差较大的两帧点云时,存在无法收敛或者陷入局部最小值的问题。为了提高算法的收敛性能,提出了一种基于LM方法改进的三维正态分布变换配准算法。

点云侠的博客 1163

Flink Gauss CDC:深度剖析存量与增量同步的创新设计

开发Flink Gauss CDC是为了适配华为自研GaussDB的特殊日志格式和逻辑复制机制,解决Flink CDC无法直接支持的问题,同时优化存量与增量同步的效率和一体化读取能力,满足GaussDB复合主键处理、数据落库等定制化需求,以实现高效、准确的数据同步。

数据与算法架构提升之路专栏 1985

二叉树详细版

为什么要研究二叉树? 特点: 每个结点的度要么是0,1或2 子树次序不能颠倒 可以为空树 二叉树和树的主要差别: 二叉树的每个结点的位置固定,可以为空,分左右,但它也不是有序树,而是一种独立的概念 以上是二叉树只有两个结点的形态,这样两种 若有3个结点,二叉树形态: 比如,可以分在两层,三层:(自己画一画) 实际上有5种:3个结点分布在一层,还有3个结点分布在两层(左右位置不一样):左右,右左,左左,右右 如果是3个结点的树,只有两种..

weixin_52634719的博客 1454

【VxWorks】Vxworks、QNX、Xenomai、Intime、Sylixos、Ucos等实时操作系统的性能特点

VxWorks 操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统,是嵌入式开发环境的关键组成部分。其内核支持多任务调度(采用基于优先级抢占方式,同时支持同优先级任务间的分时间片调度)、任务间的同步、进程间通信机制、中断处理、定时器和内存管理机制等,且提供了一个快速灵活的与 ANSIC 兼容的 I/O 系统,网络支持 对其它VxWorks系统和TCP/IP网络系统的"透明"访问。具有良好的持续发展能力、良好的可靠性、卓越的实时性和高性能的内核以及友好的用户开发环境。

smartvxworks的博客 1064

动态规划 Leetcode 96 不同的二叉搜索树

要点:1.递推公式,想到以根节点数字不同作为分类条件求和得到dp[i];

weixin_46930685的博客 298

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

【动态规划】【卡特兰数】Leetcode 96. 不同的二叉搜索树

【动态规划】【卡特兰数】Leetcode 96. 不同的二叉搜索树

prince0520的博客 858

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

最优二叉搜索树 动态规划_leetcode96. 不同的二叉搜索树

leetcode96. 不同的二叉搜索树给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?示例:输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 / / / 3 2 1 1 ...

weixin_39661345的博客 202

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

[LeetCode]96. 不同的二叉搜索树(java实现)动态规划

[LeetCode]96. (java实现)1. 题目2. 读题(需要重点注意的东西)3. 解法4. 可能有帮助的前置习题5. 所用到的数据结构与算法思想6. 总结 1. 题目 2. 读题(需要重点注意的东西) 思路(): 3. 解法 ---------------------------------------------------解法---------------------------------------------------: 可能存在的问题: 4. 可能有帮助的前置习题 5. 所用到的

cloud的博客 535

leetcode96.不同的二叉搜索树/动态规划

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 示例: 输入: 3 输出: 5 解释: 给定 n = 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1 3 2 / ...

yyf_blog 206

动态规划 | LeetCode-96. 不同的二叉搜索树

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的总数。求 n 个节点所能组成的二叉搜索树的总数,可以先取 1 个节点作为根节点,剩下的 n-1 个节点分成两堆,记为 i 和 j,分别作为左右子树。此时 n 个节点所能组成的二叉搜索树的总数,就可以拆分成左子树的可能总数 乘以 右子树的可能总数。因此,只需要遍历所有可能的左右子树的节点分布情况,最终就能算出 n 个节点所能组成的二叉搜索树的总数。最小规模的子问题是 1 个节点和 0

qq_45931691的博客 506

力扣-动态规划-96. 不同的二叉搜索树

力扣-动态规划-96. 不同的二叉搜索树

qianxunsiyue的博客 396

LeetCode 96. 不同的二叉搜索树(动态规划)

LeetCode 96. 不同的二叉搜索树。

virtual_YL的博客 203

Leetcode 96. 不同的二叉搜索树 动态规划

动态规划

想买很多漂亮衣服但是买不起的博客 119

力扣LeetCode: 96.不同的二叉搜索树(动态规划)

【代码】力扣LeetCode: 96.不同的二叉搜索树(动态规划)

欢迎访问我的个人Blog网站:blog.homeryland.org 173

力扣96. 不同的二叉搜索树(动态规划解法)

力扣96. 不同的二叉搜索树(动态规划解法)

overflow_stdio的博客 256

2021-11-16 leetcode动态规划 96.不同的二叉搜索树 c++

题目 leetcode 96. 不同的二叉搜索树 二叉搜索树 二叉搜索树 一棵搜索二叉树的两种情况: i) 空树 ii) 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值 题目要素 已知有序序列 1⋯n,求可构建出的不同二叉搜索树的种数 思路 求不同种类的二叉搜索树需要保证两个方面:二叉树的特性和不同搜索二叉树的唯一性 解释: 二叉树的特性:左子树结点值小于根结点值,右子树结点值大于根结点值; 唯一性:每个搜索二叉树都不一样 如何

weixin_51745630的博客 933

[动态规划] Leetcode 96. 不同的二叉搜索树

[动态规划] Leetcode 96. 不同的二叉搜索树

qq_44653420的博客 172
上一篇: 【leetcode】42. 连续子数组的最大和(动态规划)
下一篇: 【leetcode】46. 全排列(回溯法,回溯类问题如何解决)
eclipse_c
博客等级 码龄14年 28粉丝 162原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值