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

题目

在这里插入图片描述

解答

解法一:递归

递归直接超时。。

但是本题的最基本思路有了:

  1. 对于每一个结点都尝试作为根节点进行计算不同的左子树的可能数和右子树的可能数。
  2. 最后将所有的可能累加起来即可。

思路明了,剩下的就是优化的事了。

代码
class Solution {
    public int numTrees(int n) {
        return numTrees(1, n);
    }
    
    private int numTrees(int start, int end) {
        if(start > end) {
            return 1;
        }
        
        int res = 0;
        for(int i = start; i <= end; i ++) {
            int left = numTrees(start, i - 1);
            int right = numTrees(i + 1, end);
            res += left * right;
        }
        
        return res;
    }
}
结果

在这里插入图片描述

备忘录优化的代码一

简单的对递归操作加一个备忘录记录已经计算的结果。

复杂度:O(n^2) 时间,O(n^2) 空间。

class Solution {
    public int numTrees(int n) {
        int[][] memo = new int[n + 1][n + 1];
        return numTrees(1, n, memo);
    }
    
    private int numTrees(int start, int end, int[][] memo) {
        if(start > end) return 1;
        if(memo[start][end] != 0) return memo[start][end];
        
        int res = 0;
        for(int i = start; i <= end; i ++) {
            int left = numTrees(start, i - 1, memo);
            int right = numTrees(i + 1, end, memo);
            res += left * right;
        }
        
        memo[start][end] = res;
        return res;
    }
}
结果

在这里插入图片描述

备忘录优化的代码二

可以预见:1 … 3 与 4 … 6 其实构造的树的结构是一样的,只不过值不同而已。

如果只计算数量的话就可以将他们统一化。将空间复杂度降为 O(n)。

复杂度:O(n^2) 时间,O(n) 空间。

class Solution {
    public int numTrees(int n) {
        int[] memo = new int[n + 1];
        return numTrees(n, memo);
    }
    
    private int numTrees(int n, int[] memo) {
        if(n == 0) return 1;
        if(memo[n] != 0) return memo[n];
        
        int res = 0;
        for(int i = 1; i <= n; i ++) {
            int left = numTrees(i - 1, memo);
            int right = numTrees(n - i, memo);
            res += left * right;
        }
        
        memo[n] = res;
        return res;
    }
}
结果

在这里插入图片描述

解法二:动态规划

将备忘录优化二的代码转换成自底向上的方式就是本题动态规划的解。

下述代码的解释:

  1. 第一层 for 循环确定组成二叉树结点的个数。
  2. 第二层 for 循环确定由哪一个结点作为根节点。

复杂度:O(n^2) 时间,O(n) 空间。

代码
class Solution {
    public int numTrees(int n) {
        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. 假设由 n 个结点组成的不同的二叉搜索树数量为 h(n)。
  2. 那么现在再假设将第 k 个结点作为根节点,可以得到 f(k)=h(k-1)*h(n-k)。
  3. 而每个结点都可能会被作为根节点,也就是说 k 的取值范围是从 1 到 n 的。
  4. 所以可以推出公式:h(n) = f(1) + f(2) + … + f(n)。
  5. 进而满足了卡特兰数递推通式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + … + h(n-1)h(0) (n>=2)。

所以本题可以使用卡特兰数进行计算!

补充:卡特兰数其前几项为(从第 0 项开始): 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …

为了计算的方便,我们可以选用以下几个公式任意一个:

  • C0 = 1,Cn+1 = Cn * (4n + 2) / (n + 2)
  • Cn = (2n)! / ((n + 1)! * n !)
  • Cn = C(2n,n) / (n+1) ,此处的 C(2n,n) 是组合数。

此题我选用了第一个公式。

复杂度:O(n) 时间,O(1) 空间。

代码
class Solution {
    public int numTrees(int n) {
        long C = 1;
        for(int i = 0; i < n; i ++) {
            C = C * (4 * i + 2) / (i + 2);
        }
        return (int)C;
    }
}
结果

在这里插入图片描述

信号完整性分析学习--16--传输线效应 传输线效应 说到传输线效应,大多数人都会想到一个经验法则,那就是: “当互连线的长度大于1/6倍的信号上升时间的空间延伸时,互连线就体现出传输线效应。” 上升时间越小越容易体现传输线效应。 由此可见,同一根互连线,它是否体现传输线效应,要看它要传输什么样的信号。下图所示,一根延时为15ps的互连线,当它传输上升时间为60ps的信号时就会体现传输线效应;当它传输上升时间为180ps的信号时就不体现传输线效应。 阅读详情

相关推荐

RK3588设备树节点实战:从零配置音频与显示模块(ES8388+DSI0)

本文详细介绍了在RK3588平台上配置音频编解码器ES8388和显示接口DSI0的设备树节点实战。通过具体案例拆解设备树节点的编写逻辑与调试技巧,包括音频路由与声卡配置、DSI控制器基础配置、视频通路路由配置以及电源管理与时钟树设计。文章还提供了调试工具与实战技巧,帮助开发者快速解决常见问题。

weixin_42525637的博客 351

Leetcode 96 不同的二叉搜索树 Java 0ms 击败100%

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

看风起云落的博客 251

域格4G网优模块获取

1、获取当前小区信息 接口说明 该命令用于获取当前小区信息。 语法结构 命令类型 格式 返回结果 Execute AT+SCELLINFO +SCELLINFO: <cellMode>,<mcc>,<mnc>,<lac>,<cellId>,<afrcn>,<cpi>,<rxLevel>

自由的幻想 2463

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

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

qq_23858785的博客 578

AES128加密算法开发(含源码)

本文详解了AES128加密算法的原理与C语言实现。AES128是当前广泛使用的对称加密标准,采用128位密钥和10轮变换,具有高安全性和高效性。文章从算法背景、核心概念(混淆与扩散)入手,详细解析了4×4状态矩阵表示、4个核心变换(字节替换、行移位、列混合、轮密钥加)以及密钥扩展过程。特别针对汽车电子应用场景,如ECU通信加密、车钥匙认证等,说明了AES128在资源受限环境中的优势。通过分步图解和原理剖析,帮助开发者深入理解这一加密标准的技术细节与实现方法。

汽车电子软件开发笔记 2916

MATLAB 论文复现——面向紧急需求响应的规模化灵活资源负荷管理快速决策方法

其次,对灵活资源参与EDR的功率分配模型进行了建模,并提出了基于分层分布式共识算法的快速决策方法,对功率分配模型进行快速求解,以满足EDR实时性的需求,在保证较高精度的前提下提高了决策速度。[1]孔祥玉,杨至端,孙裕策,等.面向紧急需求响应的规模化灵活资源负荷管理快速决策方法[J/OL].电力系统自动化,1-13[2024-07-29].http://kns.cnki.net/kcms/detail/32.1180.TP.20240709.1843.002.html.关键词: 规模化灵活资源;

sjr1478的博客 373

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

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

qq_40263592的博客 2221

RTOS任务调度原理:高优先级任务为何在低优先级任务执行时无法响应

实时操作系统(RTOS)的核心在于其确定性的任务调度机制,它通过优先级抢占确保关键任务及时执行。其基本原理是调度器仅在特定调度点(如任务主动阻塞、中断退出时)运行,比较就绪态任务的优先级并切换上下文。这一机制的技术价值在于为嵌入式系统提供可预测的响应时间,广泛应用于工业控制、汽车电子和物联网设备等对实时性要求高的场景。当低优先级任务执行**长时间非阻塞运算**且无中断发生时,调度器无法被触发,导致高优先级任务虽处于就绪态却无法获得CPU,造成系统响应延迟。理解**任务状态机**与调度点,是优化实时性、避免此

weixin_33508411的博客 287

《LeetCode力扣练习》第96题 不同的二叉搜索树 Java

《LeetCode力扣练习》第96题 不同的二叉搜索树 Java 一、资源 题目: 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3 输出:5 示例 2: 输入:n = 1 输出:1 提示: 1 <= n <= 19 来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/unique-binary-search-trees

XRT_knives的博客 381

从仿真到流片:手把手教你优化65nm CMOS电荷泵的电流匹配与稳定性

本文详细介绍了在65nm CMOS工艺下优化电荷泵电流匹配与稳定性的工程实践指南。通过蒙特卡洛仿真、运放反馈结构版图技巧和全差分结构设计,实现优于1%的电流匹配精度和±2%以内的电流稳定性,特别针对current mismatch问题提供了有效的解决方案。

weixin_42522320的博客 415

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

基于Verilog的8位CPU设计及UART扩展实现方案,包含完整的架构设计、核心代码实现和仿真验证方法

a_zxswer的博客 189

LeetCode 力扣 96. 不同的二叉搜索树

题目描述(中等难度) 和 95 题一样,只不过这道题不需要输出所有的树,只需要输出所有可能的二分查找树的数量。所以完全按照 95 题思路写,大家可以先到 95 题看一看。 解法一 递归 下边是 95 题的分析。 我们可以利用一下查找二叉树的性质。左子树的所有值小于根节点,右子树的所有值大于根节点。 所以如果求 1...n 的所有可能。 我们只需要把 1 作为根节点,[ ] 空作为左子树,[ 2...

wind_liang的博客 867

C#每日面试题-属性和字段的区别

在C#面试中,“属性(Property)和字段(Field)的区别”是基础且高频的考点。很多初学者会把两者混为一谈,甚至觉得“属性就是加了get/set的字段”,但这种理解只停留在表面。面试考察的核心,是对“封装思想”的理解,以及两者在语法特性、底层实现、实际应用中的本质差异。今天我们从“基础认知→核心差异→底层原理→实际应用→面试避坑”五个层面,把这个知识点讲透,既保证新手能看懂,又能满足面试的深度要求。

Amon的专栏 777

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

设。

weixin_48941116的博客 854

IMSL CNL 7.0.0 (x86-64)Crack

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

蓝牙模块HM-10手册

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

Leetcode 96. 不同的二叉搜索树

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

珍惜 9047

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

力扣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的博客 2472

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

leetcode96. 不同的二叉搜索树

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

peony的博客 235

96. 不同的二叉搜索树 - 力扣(LeetCode)

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

Dubhehug的博客 281

golang力扣leetcode 96. 不同的二叉搜索树

96.不同的二叉搜索树96.不同的二叉搜索树题解代码 96.不同的二叉搜索树 96.不同的二叉搜索树 题解 题目:给一个中序数组1~n,求能构造出多少种不同的二叉搜索数 递归 1.不同的二叉搜索树,根节点不同 2.根节点相同的树,子树根节点不同 3.当前节点子树个数=左子树个数*右子树个数 动态规划 dp[n]:n个节点存在二叉排序树的个数 f[i]:以i为根的二叉排序树的个数 dp[n]=f[1]+f[2]+...+f[n] 当i为根时,其左子树个数i-1,右子树个数n-i f[i]=dp[i-1]

清风 602

Leetcode96. 不同的二叉搜索树

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

会流泪de鱼的博客 321

力扣96. 不同的二叉搜索树

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

2301_79385646的博客 724

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 382

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

LeetCode-96. 不同的二叉搜索树 (中等) 题目地址:https://leetcode-cn.com/problems/unique-binary-search-trees/ 文章目录LeetCode-96. 不同的二叉搜索树 (中等)1. 题目描述及示例示例一:示例二:2. 题解和代码实现定义初始状态:状态转移方程代码实现(C++ 2022-3-15)3. 总结 1. 题目描述及示例       给你一个整数 n ,求恰由 n 个节点组

qq_43377337的博客 1425

Leetcode 96. 不同的二叉搜索树 C++

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

weixin_43750513的博客 268

力扣96.不同的二叉搜索树(java)

力扣96.不同的二叉搜索树题目思路代码 LeetCode笔记汇总 题目 思路 代码

k_surge的博客 510

LeetCode 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树

梦~' 743
上一篇: Leetcode 95. 不同的二叉搜索树 II
下一篇: Leetcode 98. 验证二叉搜索树
一纸浮萍
博客等级 码龄9年 11粉丝 103原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值