力扣第96题 不同的二叉搜索树 c++ 二叉搜索树 动态规划 + 数学思维

这篇具有很好参考价值的文章主要介绍了力扣第96题 不同的二叉搜索树 c++ 二叉搜索树 动态规划 + 数学思维。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

题目

96. 不同的二叉搜索树

中等

相关标签

树   二叉搜索树   数学   动态规划   二叉树

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

示例 1:

力扣第96题 不同的二叉搜索树 c++ 二叉搜索树 动态规划 + 数学思维,动态规划,leetcode,数学,数据结构,c++,动态规划,leetcode,算法,数学

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

思路和解题方法 一 动态规划

  1. vector<int> dp(n + 1);:创建一个名为 dp 的整数向量,长度为 n+1。dp[i] 表示节点数量为 i 时的二叉搜索树数量。

  2. dp[0] = 1;:将 dp[0] 初始化为 1,因为当节点数量为 0 时,只有一种情况,即空树。

  3. for (int i = 1; i <= n; i++):遍历节点数量从 1 到 n 的所有情况。

  4. for (int j = 1; j <= i; j++):对于当前节点数量 i,遍历 j 从 1 到 i 的所有情况,表示以 j 作为根节点的情况。

  5. dp[i] += dp[j - 1] * dp[i - j];:计算以 j 作为根节点时,左子树和右子树的组合数,并将其累加到 dp[i] 中。dp[j - 1] 表示左子树的组合数,dp[i - j] 表示右子树的组合数。

  6. 最终返回 dp[n],即节点数量为 n 时的二叉搜索树数量。

复杂度

        时间复杂度:

                O(n^2)

时间复杂度为 O(n^2),因为有两个嵌套的循环。

        空间复杂度

                O(n)

空间复杂度为 O(n),因为使用了一个长度为 n+1 的向量来保存中间结果。

c++ 代码一

class Solution {
public:
    int numTrees(int n) {
        // 创建一个长度为n+1的vector,用于存储不同数值的二叉搜索树的数量
        vector<int> dp(n + 1);
        // 初始化dp[0]为1,因为空二叉树也算一棵二叉树
        dp[0] = 1;
        // 循环计算dp数组中每个元素的值
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= i; j++) {
                // 根据公式计算dp[i]的值,即左子树数量×右子树数量之和
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        // 返回dp[n],即n个节点的不同数值的二叉搜索树的数量
        return dp[n];
    }
};

思路和解题方法 二 数学思维

代码中,使用了一个变量C来表示二叉搜索树的数量。初始时,将C设置为1。

然后通过循环遍历i从0到n-1的所有情况,进行如下操作:

  1. 将C乘以2 * (2 * i + 1)。这一步是为了计算当前节点数量为i+1时,左子树的组合数。因为左子树的节点数量比根节点小,所以乘以2 * (2 * i + 1)可以得到左子树的组合数。

  2. 将C除以(i + 2)。这一步是为了计算右子树的组合数。右子树的节点数量比根节点大,所以除以(i + 2)可以得到右子树的组合数。

通过每次循环更新C的值,最终得到的C即为n个节点的二叉搜索树的数量。

这段代码利用了组合数的性质,将计算二叉搜索树数量的问题转化为了求解组合数的问题。

通过不断更新C的值,可以高效地计算出给定节点数量的二叉搜索树的数量。

需要注意的是,由于C的值可能非常大,所以在返回结果之前,将C强制转换为int类型。

复杂度

        时间复杂度:

                O(n)

时间复杂度分析: 代码中的循环从0到n-1遍历,每次循环都执行一些基本的数学运算,包括乘法、除法和加法。这些运算的时间复杂度都是常数级别的。因此,整个循环的时间复杂度为O(n)。

        空间复杂度

                O(1)

空间复杂度分析: 代码中只使用了一个变量C来存储二叉搜索树的数量,而且在整个过程中不需要额外的数据结构来存储中间结果。因此,空间复杂度为O(1),即常数级别的空间消耗。

c++ 代码二

class Solution {
public:
    int numTrees(int n) {
        long long C = 1; // 初始化组合数C为1,用于存储二叉搜索树的数量
        for (int i = 0; i < n; ++i) { // 循环计算每个节点数量的二叉搜索树的数量
            C = C * 2 * (2 * i + 1) / (i + 2); // 计算组合数C的值
        }
        return (int)C; // 将组合数C强制转换为int类型并返回
    }
};

觉得有用的话可以点点赞,支持一下。

如果愿意的话关注一下。会对你有更多的帮助。

每天都会不定时更新哦  >人<  。文章来源地址https://www.toymoban.com/news/detail-738527.html

到了这里,关于力扣第96题 不同的二叉搜索树 c++ 二叉搜索树 动态规划 + 数学思维的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【LeetCode题目详解】第九章 动态规划part03 343. 整数拆分 96.不同的二叉搜索树 (day41补)

    给定一个正整数  n  ,将其拆分为 k 个 正整数 的和(  k = 2  ),并使这些整数的乘积最大化。 返回 你可以获得的最大乘积  。 示例 1: 示例 2: 提示: 2 = n = 58 看到这道题目,都会想拆成两个呢,还是三个呢,还是四个.... 我们来看一下如何使用动规来解决。 # 动态规划 动

    2024年02月10日
    浏览(34)
  • 算法刷刷刷|动态规划篇|509.斐波那契数| 70.爬楼梯| 746.使用最小花费爬楼梯| 62.不同路径| 63不同路径2| 343.正数拆分 | 96.不同的二叉搜索树

    509. 斐波那契数 斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是: F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 给定 n ,请计算 F(n) 。 70.爬楼梯 746.使用最小花费爬楼梯 给你一个整数

    2023年04月23日
    浏览(47)
  • 96. 不同的二叉搜索树

    目录 1、题目描述 2、思路:动态规划 2.2、确定递推公式 2.3、dp数组初始化 2.4、确定遍历顺序 3、C++实现如下 给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。 示例 1: 输入:n = 3 输出:5 示例

    2024年02月02日
    浏览(63)
  • leetcode做题笔记96. 不同的二叉搜索树

    给你一个整数  n  ,求恰由  n  个节点组成且节点值从  1  到  n  互不相同的  二叉搜索树  有多少种?返回满足题意的二叉搜索树的种数。 本题与上题近似,只需分别考虑左右子树,即f[j-1]*f[i-j]得到状态方程,最后输出f[n[即可,或者直接使用公式,二叉搜索树的种数与

    2024年02月11日
    浏览(25)
  • 【动态规划 NK刷题记 DP5 之 有多少个不同的二叉搜索树

    目录  一、题解部分 1.1题目 1.2铺垫 1.3.题解: 二、法一:递归实现 1.输入数据,创建动态数组  2.断言dp指针,并给它赋值 3.打印结果并调用函数 3.1注意: 4.实现函数binarytree 4.1先将动态数组dp[i]中特殊的值给出来,比如i=1,i=0时 4.2然后循环遍历节点的数量为i时,根节点j的

    2024年02月07日
    浏览(52)
  • 算法训练第四十一天|343. 整数拆分 、96.不同的二叉搜索树

    题目链接:343. 整数拆分 参考:https://programmercarl.com/0343.%E6%95%B4%E6%95%B0%E6%8B%86%E5%88%86.html 题目描述 给定一个正整数 n,将其拆分为至少两个正整数的和,并使这些整数的乘积最大化。 返回你可以获得的最大乘积。 示例 1: 输入: 2 输出: 1 解释: 2 = 1 + 1, 1 × 1 = 1。 示例 2: 输入:

    2023年04月24日
    浏览(31)
  • java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

    java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完): https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只不过是将多余的步骤,提前放到dp数组中(就是一个数组,只

    2024年01月21日
    浏览(46)
  • LeetCode热题HOT100:76. 最小覆盖子串,84.柱状图中最大的矩形、96. 不同的二叉搜索树

    题目 :给你一个字符串 s 、一个字符串 t 。返回 s 中涵盖 t 所有字符的最小子串。如果 s 中不存在涵盖 t 所有字符的子串,则返回空字符串 “” 。 注意: 对于 t 中重复字符,我们寻找的子字符串中该字符数量必须不少于 t 中该字符数量。 如果 s 中存在这样的子串,我们保

    2023年04月19日
    浏览(32)
  • 力扣第474题 一和零 c++ 动态规划 01背包

    474. 一和零 中等 相关标签 数组   字符串   动态规划 给你一个二进制字符串数组  strs  和两个整数  m  和  n  。 请你找出并返回  strs  的最大子集的长度,该子集中  最多  有  m  个  0  和  n  个  1  。 如果  x  的所有元素也是  y  的元素,集合  x  是集合  y

    2024年02月06日
    浏览(28)
  • 力扣第494题 目标和 c++ 动态规划 c++ 01背包 难~~

    494. 目标和 中等 相关标签 数组   动态规划   回溯 给你一个非负整数数组  nums  和一个整数  target  。 向数组中的每个整数前添加  \\\'+\\\'  或  \\\'-\\\'  ,然后串联起所有整数,可以构造一个  表达式  : 例如, nums = [2, 1]  ,可以在  2  之前添加  \\\'+\\\'  ,在  1  之前添加 

    2024年02月06日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包