【leetcode】96. 不同的二叉搜索树(unique-binary-search-trees)(DP)[中等]

2023-05-16

链接

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

耗时

解题:51 min
题解:36 min

题意

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

思路

透过现象看本质。画图找规律。从1画到4,在画的时候,发现当整数的个数相同时,其实无论它们的数值是什么,二叉搜索树的种数是一样的,比如:以 1 … 3 为节点 和 以 2 … 4 为节点组成的二叉搜索树的个数相同。并且以 1 … n 为节点组成的二叉搜索树可以将 1 … n 任意一个数作为根节点,那么其左子树可以有 0~n-1 个节点(根节点为1时,左子树有0个节点,根节点为2时,左子树有1个节点,,,),相应地,当左子树有 i 个节点时,右子树对应有 n-1-i 个节点,而且此时的二叉搜索树种数 应该是 左子树(i个节点)的种数 乘以 右子树(n-1-i 个节点)的种数。如果用 f[i] 表示 以 i 为节点组成的二叉搜索树的种数,那么其中 当 左 子 树 有 j 个 节 点 时 的 二 叉 搜 索 树 的 种 数 = f [ j ] ∗ f [ i − 1 − j ] 当左子树有 j 个节点时的二叉搜索树的种数 = f[j]*f[i-1-j] j=f[j]f[i1j]。最终,以 1 … n 为节点组成的二叉搜索树的种数就应当是将左子树的节点数为 0~n-1 时的二叉搜索树的种数加起来。
f [ i ] = ∑ j = 0 i − 1 f [ j ] ∗ f [ i − 1 − j ] f[i]=\sum_{j=0}^{i-1} f[j]*f[i-1-j] f[i]=j=0i1f[j]f[i1j]

时间复杂度: O ( n 2 ) O(n^2) O(n2)

AC代码

class Solution {
public:
    int numTrees(int n) {
        vector<int> f(n+1, 0);
        f[0] = f[1] = 1;
        for(int i = 2; i <= n; ++i) {
            for(int j = 0; j < i; ++j) {
                f[i] += f[j]*f[i-1-j];
            }
        }
        return f[n];
    }
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【leetcode】96. 不同的二叉搜索树(unique-binary-search-trees)(DP)[中等] 的相关文章

  • 使用带有通配符的 jquery grep 搜索对象数组

    我正在使用 jquery grep 搜索对象数组 并希望在搜索中包含通配符 例如 我有一个数组如下 courses code ENCH3TH otherFields otherStuff code ENCH3THHS1 otherField
  • Crystal lang如何从http获取二进制文件

    In Ruby require open uri download open http example com download pdf IO copy stream download my file pdf 如何在水晶中做同样的事情 我们
  • grep 查找 Unix 中的特殊字符

    我有一个日志文件 application log 其中可能包含以下多行普通和特殊字符字符串 Q 我想搜索包含这个特殊字符串的行号 grep Q application log 上述命令不返回任何结果 获取行号的正确语法是什么 Tell gr
  • 在 R 中读入原始二进制数据并将其转换为整数

    我有一个二进制文件 其中包含编码为不同长度 主要是 2 4 字节 的有符号或无符号整数的数值 为了处理这些数据 我将文件的所需部分读取为raw向量与readBin 然后尝试将其转换为十进制 问题是 R的内置函数有限制 我不太明白 比如没有l
  • AWK 将十进制转换为二进制

    我想使用 AWK 将文件中的十进制数字列表转换为二进制 但似乎没有内置方法 示例文件如下 134218506 134218250 134217984 1610612736 16384 33554432 这是一个 awk 方式 为您的乐趣而函
  • 使 IPTC 数据可搜索

    我对 IPTC 元数据有疑问 是否可以通过 IPTC 元数据 关键字 搜索不在数据库中的图像并显示它们 我将如何执行此操作 我只需要一个基本的想法 我知道 PHP 有 iptcparse 函数 我已经编写了一个函数来获取画廊文件夹和所有子目
  • ANDROID:如何从所有窗口顶部的通知或长按搜索按钮启动弹出对话框?

    我已经搜索过 一切都是关于启动活动而不是对话框 我想要做的是在状态栏中显示通知 当用户按下它时 在用户单击通知之前正在查看的内容之上会弹出一个对话框 我不希望对话框显示在主要活动或最近的应用程序列表的顶部 另外 如何通过长按搜索按钮启动对话
  • 用二进制数、常规数字和格雷编码填充矩阵

    我有一个包含 1 s 或 0 s 的矩阵 用于创建二进制数 其宽度为n 对于 n 2 和 n 3 它看起来像 00 000 01 001 10 010 11 011 100 101 110 111 等等 现在我正在使用以下代码来生成它 in
  • Twitter Bootstrap 行过滤器/搜索框

    我无法找到有关如何为 Twitter Bootstrap 创建简单搜索查询或行过滤器的教程 我已经尝试了很多 我不确定是否我做错了什么或者插件与 Bootstrap 不兼容 如果可以的话请帮忙 我试过了 document ready fun
  • 如何在 Eclipse 中启用“实时搜索”?

    In 科莫多 编辑 http www activestate com komodo edit 工具栏中有一个输入字段 当我在其中输入文本时 它会突出显示匹配的搜索结果 Eclipse 中是否有类似的东西 直接或通过插件 As TK Gosp
  • 计算列表的累积和,直到出现零

    我有一个 长 列表 其中随机出现零和一 list a 1 1 1 0 1 1 0 1 0 1 1 1 我想获取 list b 列表中出现 0 之前的总和 出现0的地方 在列表中保留0 list b 1 2 3 0 1 2 0 1 0 1 2
  • 查找所有n位相邻数字为1的n位二进制数[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 让我用一个例子来解释一下 如果n 4
  • 在代码中创建时 UISearchDisplayController 不工作?

    我正在开发一个选项卡栏应用程序 其中一个选项卡有一个连接到 UISearchBar 的 UISearchDisplayController 所有这些都已连接到 NIB 中并且正在工作 当我点击搜索栏时 范围 和 取消 按钮会飞入等 并且搜索
  • Solr 阿拉伯语

    我正在使用 Solr 来索引 3 种语言 阿拉伯语 法语和英语 的文档 我使用了这个 fieldType
  • Ruby 在带有偏移量的数组中查找

    我正在寻找一种以更简洁的方式在 Ruby 中执行以下操作的方法 class Array def find index with offset offset block offset 1 find block end end offset a
  • 字符串插值搜索

    对于那些不熟悉插值搜索的人来说 这是一种在排序数组中搜索值的方法 可能比二分搜索更快 您查看第一个和最后一个元素 并 假设数组的内容均匀分布 线性插值以预测位置 例如 我们有一个长度为 100 的数组 其中 array 0 0 和 arra
  • 将浮点数 1864.78 转换为二进制和 IEEE 格式

    我一直在尝试将 S P 500 的值 今天为 1864 78 转换为它在内存中以 IEEE 单精度格式表示的方式 转换小数点左边 1864 很容易 11101001000 但如何获得十进制 78 的二进制表示形式呢 我尝试使用该技术 但它会
  • vim 按语法高亮类型搜索

    我正在将 i18n 添加到现有项目 Web 应用程序 这涉及到用对 i18n 库的调用来替换静态文本的每一位 如果能够搜索该文本 而不是依靠语法突出显示来直观地识别它 将会很方便 在 vim 中 是否可以在文件中搜索特定突出显示类型的出现
  • 从 Nodejs 提供二进制/缓冲区/base64 数据

    我在从节点提供二进制数据时遇到问题 我开发了一个名为的节点模块节点说话它执行 TTS 文本到语音 并返回 Base64 编码的音频文件 到目前为止 我这样做是为了转换base64到缓冲区 二进制文件 然后提供它 var src Base64
  • C 编程 - 文件 - fwrite

    我有一个关于编程和文件的问题 while current NULL if current gt Id Doctor 0 current current gt next id doc current gt Id Doctor if curre

随机推荐