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]作为答案。 阅读详情

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

示例:
输入: 3
输出: 5

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

   1         3     3      2      1
    \       /     /      / \      \
     3     2     1      1   3      2
    /     /       \                 \
   2     1         2                 3

思路

方法一 动态规划
给定一个有序序列 1 … n,为了根据序列构建一棵二叉搜索树。我们可以遍历每个数字 i,将该数字作为树根,1 … (i-1) 序列将成为左子树,(i+1) … n 序列将成为右子树。于是,我们可以递归地从子序列构建子树。 在上述方法中,由于根各自不同,每棵二叉树都保证是独特的。

可见,问题可以分解成规模较小的子问题。因此,我们可以存储并复用子问题的解,而不是递归的(也重复的)解决这些子问题,这就是动态规划法。

算法

问题是计算不同二叉搜索树的个数。为此,我们可以定义两个函数:

G(n): 长度为n的序列的不同二叉搜索树个数。

F(i, n): 以i为根的不同二叉搜索树个数( 1 ≤ i ≤ n)。

可见,

G(n) 是我们解决问题需要的函数。

G(n)可以从 F(i, n)得到,而 F(i, n) 又会递归的依赖于 G(n)G(n)。

首先,不同的二叉搜索树的总数 G(n),是对遍历所有 i (1 <= i <= n) 的 F(i, n) 之和。换而言之:
在这里插入图片描述
特别的,对于边界情况,当序列长度为 1 (只有根)或为 0 (空树)时,只有一种情况。亦即:

G(0)=1,G(1)=1

给定序列 1 … n,我们选出数字 i 作为根,则对于根 i 的不同二叉搜索树数量 F(i, n),是左右子树个数的笛卡尔积,如下图所示:

在这里插入图片描述
举例而言,F(3, 7),以 3 为根的不同二叉搜索树个数。为了以 3 为根从序列 [1, 2, 3, 4, 5, 6, 7] 构建二叉搜索树,我们需要从左子序列 [1, 2] 构建左子树,从右子序列 [4, 5, 6, 7] 构建右子树,然后将它们组合(即笛卡尔积)。 巧妙之处在于,我们可以将 [1,2] 构建不同左子树的数量表示为 G(2), 从 [4, 5, 6, 7]` 构建不同右子树的数量表示为 G(4)。这是由于 G(n) 和序列的内容无关,只和序列的长度有关。于是,F(3,7)=G(2)⋅G(4)。 概括而言,我们可以得到以下公式:
在这里插入图片描述
将公式 (1),(2) 结合,可以得到 G(n)的递归表达公式:
为了计算函数结果,我们从小到大计算,因为 G(n) 的值依赖于 G(0)…G(n−1)。

根据以上的分析和公式,很容易实现计算G(n) 的算法。 下面是示例:

public class Solution {
  public int numTrees(int n) {
    int G[n+1];
    G[0] = 1;
    G[1] = 1;

    for (int i = 2; i <= n; ++i) {
      for (int j = 1; j <= i; ++j) {
        G[i] += G[j - 1] * G[i - j];
      }
    }
    return G[n];
  }
}

时间复杂度为 O(N^2)

**方法二 卡塔兰数 **
在这里插入图片描述

class Solution {
public:
    int numTrees(int n) {
         // Note: we should use long here instead of int, otherwise overflow
    long C = 1;
    for (int i = 0; i < n; ++i) {
      C = C * 2 * (2 * i + 1) / (i + 2);
    }
    return (int) C;
    }
};

卡塔兰数是组合数学中一个常在各种计数问题中出现的数列。
在这里插入图片描述
Catalan数相关的算法问题

IPMItool 控制风扇转速 然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。 阅读详情

相关推荐

2022年全球市场微波等离子体CVD反应器总体规模、主要生产商、主要地区、产品和应用细分研究报告

据GIR (Global Info Research)调研,按收入计,2021年全球微波等离子体CVD反应器收入大约 百万美元,预计2028年达到 百万美元,2022至2028期间,年复合增长率CAGR为 %。

MARKETRESEARCH的博客 1137

leetcode:96. 不同的二叉搜索树

题目来源 96. 不同的二叉搜索树 题目描述 题目解析 动态规划 假设n个节点存在二叉排序树的个数是G(n),令f(i)是以i为根的二叉搜索树的个数,则有 G(n)=f(1)+f(2)+f(3)+...f(n)G(n)=f(1)+f(2)+f(3)+...f(n)G(n)=f(1)+f(2)+f(3)+...f(n) n为根节点,当i为根节点时,其左子树节点个数为[1,2,3...i-1],右子树节点个数为[i+1, i+2,... n],所以当i为根节点时,其左子树节点个数为i-1个,右子树节点为n-i

OceanStar的博客 1217

陆地观测卫星数据服务平台深度体验:高分、中巴、资源系列影像的检索与下载技巧

本文深度解析国产陆地观测卫星数据服务平台的使用技巧,重点介绍高分、中巴、资源系列卫星影像的检索与下载方法。通过权限体系解析、高级检索策略、数据预处理等实战技巧,帮助用户高效获取高质量遥感数据,适用于环境监测、资源调查等多种应用场景。

eee77的博客 980

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树

梦~' 743

MuJoCo 相机图片怎么拿?视角调整获取物体图片及实时显示(附代码)

在Mujoco的仿真中,对于识别抓取场景来说,如何获得添加的body等物体的实时图像很重要,今天就分享下如何添加相机视角及可视化小方块(举例)的实时图片。复制一个scene.xml为scene_withcamera.xml,在xml中添加camera和小方块如下。设置xml文件中添加的相机body id。需要创建一个离屏渲染器。

darcsdn 2128

基于 YOLOv26 的 PCB 板缺陷检测:工业级视觉实战

本文提出了一种基于YOLOv26的PCB板缺陷检测系统,通过深度学习技术实现对PCB板缺陷的自动化检测。系统能够识别短路、开路、焊点不良等8种常见缺陷,具有高精度、多类别分类和实时推理等优势。文章详细介绍了系统架构,包括数据采集、预处理、YOLOv26模型检测和后处理模块。在代码实现部分,给出了环境配置、数据预处理与增强的具体方法,使用Albumentations库进行图像增强处理。该系统为电子制造业提供了高效、准确的PCB质量检测解决方案,显著提升了检测效率和准确性。

一键难忘的博客 336

leetcode96--不同的二叉搜索树[java]

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?这个暴力的递归,执行起来.在leetcode 上跑不过去,会超出时间限制。代码逻辑不改,我们用递归加缓存 再来一版 ,就能跑过去。要把可能组建左子树的情况,去乘右子树可能的情况。但是代码是没问题的,我下面给你验证他是没问题的。因此.在递归时,我们选中一个数字做头节点后,逻辑和暴力递归是一样的,只是我们加了缓存,缓存怎么加,就是对递归里的变量进行缓存,大于这个数字的,可以做右子树.因此加个二维数组,就可以了,

SP_1024的博客 878

保姆级教程!Python爬虫爬取知乎回答,保存为Markdown文件

本教程实现了知乎公开回答的完整爬取与Markdown保存,核心流程为「请求页面→解析作者/时间/正文/图片→下载图片→保存MD文件」,步骤清晰,代码可直接复用关键特性:支持合并/单文件两种保存模式、自动下载图片并引用、中文乱码防护、非法文件名过滤,满足日常整理知乎回答的需求新手友好:无需复杂配置,仅需修改知乎问题URL即可运行,全程无坑,5分钟内可看到运行结果灵活扩展:支持进阶优化(登录、分页、格式完善),可根据个人需求调整功能。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1232

leetcode96---不同二叉搜索树的数量

不同二叉搜索树的数量—leetcode96题 一、题目描述 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例1: 输入: n=3 输出:5 示例 2: 输入:n = 1 输出:1 二、方法 经过简单分析,可以看出n个结点的二叉搜索树与前n-1个存在一定关系,是在前n-1个的基础上进行计算的,所以这是一道动态规划题目。 列状态转移方程: 采用宏观的思考,不去在意过多的细节。只考虑不同数字作根节点的情况。 假设有n个

weixin_40794404的博客 1153

UFS软件分区介绍

本文主要介绍了ufs软件分区管理的概况,能够使大家对软件分区有个大体的认识

肥匪斐's blogs 1万+

中小企业办公网络配置综合实验华为设备(NAT+策略路由+OSPF+VLAN)

组网需求: 1、PC1、2、3、4均可以访问internet的lo0:8.8.8.8 2、PC1、PC4通过电信ISP访问internet;PC2、PC3通过联通ISP访问internet; 需求分析: 1、internet路由器模拟公网,8.8.8.8模拟公网IP;电信ISP、联通ISP路由器模拟电信和联通运营商;出口路由为企业出口路由器;这四个路由器直连链路之间运行ospf,配置动态路由,实现互通; 2、出口路由与三层交换直连链路运行ospf,动态同步路由信息; 3、出口路由器内网端口配..

A soul tortured by desire 7123

(多种写法)【LeetCode96】不同的二叉搜索树

本文最早发自微信公众号【有趣理工男】,朋友们可以关注一波。 题目 Given an integer n, return the number of structurally unique BST’s (binary search trees) which has exactly n nodes of unique values from 1 to n. 示例1 输入:n = 3 输出:5 示例 2: 输入:n = 1 输出:1 思路 解决这道题我们先从基本的 Top-down (递归)写法入手,之后改

冰霜青羽的博客 357

学Simulink——四开关 Buck‑Boost(FSBB)变换器的无缝模式切换仿真

本文详细介绍了使用Simulink实现四开关Buck-Boost(FSBB)变换器无缝模式切换的仿真方法。FSBB变换器因其输入输出同极性、单电感和双向能量流特性,广泛应用于光伏储能、USB-PD和车载电源等场景。文章重点解决了模式切换中的直通风险和占空比跳变问题,通过统一电压PI控制、Stateflow模式仲裁和200ns死区设计,实现了Buck(26V→24V)、Pass-Through(24V±1V)和Boost(22V)三种工作模式的无缝过渡。仿真结果显示输出电压稳定在12V±0.15V,切换过程无

amy_mhd的博客 65

LeetCode 题目 96:从动态规划、递归到卡塔兰数实现不同的二叉搜索树

本文详细介绍了 动态规划、递归和数学公式-卡塔兰数介绍二叉搜索树

10年数据\经营分析经验,现任大厂数据分析负责人 732

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

LeetCode96 DP\卡塔兰数:不同的二叉搜索树

给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? DP /* 二叉查找树(搜索树): 根节点的值大于其左子树中任意一个节点的值,小于其右节点中任意一节点的值。 */ int main() { int n; cin>>n; int sum[100] = {1}; // cout<<sum[0]<<endl; sum[1] = 1; sum[2] = 2; for(int len=3; len&lt

Rainbow 251

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

LeetCode 96.不同的二叉搜索树(Java,动态规划、卡塔兰数)

题目描述 解法1-动态规划 解题思路:给定一个有序序列1⋯n1\cdots n1⋯n,为了构建一棵二叉树,我们可以遍历每个数字 iii,将该数字作为树根,然后将1⋯(i−1)1\cdots (i-1)1⋯(i−1)作为根结点的左子树,将(i+1)⋯n(i+1)\cdots n(i+1)⋯n作为根结点的右子树。由于每次遍历根结点是不同的,所以可以保证构造的每棵二叉树都是唯一的。 定义两个函数: G(n)G(n)G(n):长度为nnn的序列能构造的不同二叉树的个数; F(i,n)F(i,n)F(i,n):以

qq_42325416的博客 197

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

[leetcode 96] 不同的二叉搜索树 (python+动态规划/卡塔兰数)

目录题目描述解题思路方法一:动态规划方法二:数学法代码实现方法一:动态规划方法二:数学法Tips 题目描述 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 示例: 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-binary-search-trees 解题思路 方法一:动态规划 给定一个有序序列1···n,为了构建出一棵二叉搜索树,可以遍历每个数字i,将该数字作为树根,将1···(i−1)(i - 1)(i−1

进阶中的程序员吃吃的博客 497

leetcode 96. 不同的二叉搜索树 -树的种数 -动态规划 -卡塔兰数

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 输入:n = 3 输出:5 输入:n = 3 输出:5 题目分析 二叉搜索树性质:给定一串序列,生成唯一的一种二叉树 总节点数目为i的时候,给定一个结点j 则j的左子树有j-1个结点,都比j小,有j-1种排列;右子树中有i-j 个结点,有i-j个结点,都比j大,有i-j种排列 题解 - 通过 class Solution: def numTrees(self, n:

Julse的博客 485

leetcode96不同的二叉搜索树

leetcode96不同的二叉搜索树,动态规划,格兰特数

sxycylq的博客 155

第九章动态规划——不同的搜索二叉树

动态规划解决不同的二叉搜索树问题,找寻规律,发现数学方法,新手也能学会!!!

WenJGo的博客 1884

LeetCode—96. Unique Binary Search Trees

LeetCode—96. Unique Binary Search Trees 题目 https://leetcode.com/problems/unique-binary-search-trees/ 一个有n个节点的二叉搜索树,有多少种不同的结构。 思路及解法 二叉搜索树:对于任意一个节点root,其左子树中的元素小于root,其右子树中的元素大于root。二叉搜索树的中序遍历是非递减的。 解...

pnnngchg的博客 218

【leetcode】96. Unique Binary Search Trees

96.Unique Binary Search Trees Givenn, how many structurally uniqueBST's(binary search trees) that store values 1 ...n? Example: Input: 3 Output: 5 Explanation: Given n = 3, there are a total ...

lemonade13的博客 235

2020年7月15日打卡

最近怎么天天是动态规划。。 Leetcode 96. 不同的二叉搜索树 题目 给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种? 题解 首先确定该题十有八九还是动态规划,然后确定函数,先把 i 个节点的二叉搜索树个数记为 F[i],然后就没思路了,之后尝试了找规律、套用数学公式均失败,直接看题解。 题解方法一的方法和我最初的思路一样,先把 i 个节点的二叉搜索树个数记为 F[i],但是题解将每 n 个节点看作从 1 到 n 分别作为根节点、进而求 F[n] * F[i - n],得出这么个

weixin_41058363的博客 159

LeetCode 96.Unique Binary Search Trees

LeetCode 96.Unique Binary Search TreesGiven n, how many structurally unique BST’s (binary search trees) that store values 1…n?For example, Given n = 3, there are a total of 5 unique BST’s. 1

编程小白的进阶之路 224

LeetCode96 n个节点组成的不同二叉搜索树

方法一: 本题用到了卡塔兰数,其计算公式为 C0=1,Cn+1=2(2n+1)n+2∗CnC_0 = 1, C_{n+1} = \frac{2(2n+1)}{n+2}*C_nC0​=1,Cn+1​=n+22(2n+1)​∗Cn​。 任何长度的不同二叉搜索树数量都可以用此式子计算。 【时间复杂度O(n)O(n)O(n),空间复杂度O(1)O(1)O(1)】 方法二: 此外,还有一种DP的推理方法,假设有 1,2,...,n1, 2, ..., n1,2,...,n 个节点,选取任意一个节点iii作为根节点,.

Noric! 的博客 939

炉石插件 HsMod 免费完整指南:从 BepInEx 注入到 60+ 功能,皮肤全开、战棋开局看清 MMR

HsMod 是一款炉石插件,一次注入解决两件事:不花金币用上全部皮肤,以及酒馆战棋开局就能直接看到对手的 MMR。它基于 BepInEx 注入框架向炉石进程内加载一个 `HsMod.dll`,再用 Harmony 在运行时改写指定方法——不改动游戏的 `Assembly-CSharp.dll`。功能有六十余项,完全免费、开源(AGPL-3.0 协议)、不收集任何个人数据。想换外观、看数据或挂机,装

gitblog_01002的博客 387
上一篇: leetcode(94) 二叉树的中序遍历——莫里斯遍历(非传统递归方法)
下一篇: POJ 3255 次短路
softwareX4
博客等级 码龄9年 21粉丝 63原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值