当前位置: 首页 > news >正文

【LeetCode】不同的二叉搜索树 [M](卡特兰数)

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

一、题目

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

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

二、代码

class Solution {public int numTrees(int n) {return compute(n);}public int compute(int N) {// 过滤特殊值if (N < 0) {return 0;}if (N < 2) {return 1;}long a = 1;long b = 1;long c = 0;// 2nlong limit = N << 1;// 1、计算c(2N, N) = b / afor (long j = 1, i = N + 1; j <= N && i <= limit; j++, i++) {// 计算a:从1累乘到na *= j;// 计算b:从n+1一直累乘到2n  b *= i;// 求a和b的最大公因数,用来对a和b进行分数化简,避免在计算过程中溢出。// 如果这里不进行化简的话,当N比较大的时候就会出现数据溢出情况c = gcd(a, b);a /= c;b /= c; }// 2、计算公式3的计算结果// 公式3:k(n)= c(2n, n) / (n + 1)// c(n, m) = n(n-1)...(n-m+1) / m!// b:2n * (2n - 1) * ... * (2n - n + 1)   也就是从n+1一直累乘到2n// a:1 * 2 * ... * (n - 1) * n   也就是从1一直累乘到n// c(2N, N) = b / areturn (int) ((b / a) / (N + 1));}// 辗转相除法求最大公因数public long gcd(long a, long b) {long c = a % b;if (c != 0) {return gcd(b, c);} else {return b;}}
}

三、解题思路 

卡特兰数满足如下关系式:

k(0)= 1, k(1)= 1时,如果接下来的项满足:

k(n)= k(0)*k(n-1) + k(1)*k(n- 2) + ... + k(n- 2)*k(1) + k(n- 1)* k(0)

或者

k(n)= C(2n, n) - C(2n, n-1)

或者

k(n)= C(2n, n) / (n + 1)

就说这个表达式,满足卡特兰数。

总的来说,需要剖析出这道题的本质:

假设n个节点存在二叉排序树的个数是G(n),1为根节点,2为根节点,...,n为根节点,当1为根节点时,其左子树节点个数为0,右子树节点个数为n-1,同理当2为根节点时,其左子树节点个数为1,右子树节点为n-2,所以可得G(n) = G(0)*G(n-1)+G(1)*(n-2)+...+G(n-1)*G(0)。

明白了这道题的本质,发现了这个计算式子,就马上意识到这是一个卡特兰数的题目,直接用卡特兰数的计算公式计算结果即可。

http://www.lryc.cn/news/5300.html

相关文章:

  • 【软件相关】文献管理工具——Zotero
  • leetcode练习一:数组(二分查找、双指针、滑动窗口)
  • iPhone更新iOS 16.3出现应用卡死、闪退的问题怎么办?
  • TCP协议原理一
  • 【黑马SpringCloud(6)】Sentinel解决雪崩问题
  • 微信小程序 java springboot招聘求职应聘简历系统
  • 亿级高并发电商项目-- 实战篇 --万达商城项目 四(Dashboard服务、设置统一返回格式与异常处理、Postman测试接口 )
  • 为什么这11道JVM面试题这么重要(附答案)
  • 概率统计之概率篇
  • 综合项目 旅游网 【5.旅游线路收藏功能】
  • 【ArcGIS Pro二次开发】(3):UI管理_显示隐藏Tab、Group、Control等控件
  • Spring Boot开发实战——echarts图标填充数据
  • 李达聪老师:互联网时代的B2B品牌如何塑造
  • javaEE 初阶 — 连接管理机制
  • 40个改变你编程技能的小技巧!
  • iTOP3588开发板直连电脑配置方法(无线上网)配置主机IP
  • 压电陶瓷换能器导纳圆图公式推导及匹配
  • 设计模式C++实现11:观察者模式
  • l1和l2接口如何进行编写?一定要掌握这几个元素
  • GAMES101作业7及课程总结(重点实现多线程加速,微表面模型材质)
  • 面试题(二十四)数据结构与算法
  • 【HAL库】STM32CubeMX开发----STM32F407----Uart串口接收空闲中断
  • Qt_文件操作
  • int和Integer有什么区别?
  • Axure 9 收录不同效果的制作过程
  • [Datawhale][CS224W]图神经网络(一)
  • 【Android实现16位灰度图数据转RGB数据并以bitmap格式显示】
  • uni-app②
  • FFmpeg视频处理
  • FreeRTOS任务通知 | FreeRTOS十二