专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Leetcode每日刷题(三)

题目:不同的二叉搜索树

描述:给定一个整数 85_1.png,求以 85_2.png 为节点组成的二叉搜索树有多少种?

示例

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

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

解法一:动态规划

思路:

给定一个有序序列 85_3.png ,为了构建出一个二叉搜索树,可遍历每个数字 85_4.png ,将该数字作为树根,将 85_5.png 序列作为左子树,将 85_6.png 作为右子树,接着可按照同样的方法递归构建左子树和右子树。

方案

定义两个函数

1、 85_7.png 长度为 85_8.png 的序列可构成的二叉搜索树个数。
2、 85_9.png85_10.png 为根、序列长度为 85_11.png 的不同二叉搜索树个数 85_12.png

易得

85_13.png

对于给定序列 85_14.png,我们选择数字作 85_15.png 为根,则根为 85_16.png 的所有二叉搜索树的集合是左子树集合和右子树集合的笛卡尔积

即:

85_17.png

由此得出:

85_18.png

对于边界条件,当序列长度为为 85_19.png(只有根)或为 85_20.png(空树)时,只有一种情况,即:

85_21.png

代码实现如下:

public static int numTrees(int n) {
    int[] ints = new int[n + 1];
    ints[0] = 1;
    ints[1] = 1;

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

  • 时间复杂度:85_22.png85_23.png 表示二叉搜索树的节点个数
  • 空间复杂度:85_24.png

解法二:数学

思路:

解法一中推到出的 85_25.png 函数的值在数学上称为卡塔兰数 85_26.png 。卡塔兰数有以下特性:

85_27.png

即:

85_28.png

public static int numTrees(int n) {
    long c = 1;
    for (int i = 2; i <= n; i++) {
        // 这里不要用 *=, 否则会出现因整除省略小数导致的结果异常
        c = c*2*(2*i - 1)/(i + 1);
    }
    return (int)c;
}

  • 时间复杂度:85_29.png85_30.png 表示二叉搜索树的节点个数
  • 空间复杂度:85_31.png

文章永久链接:https://tech.souyunku.com/26463

未经允许不得转载:搜云库技术团队 » Leetcode每日刷题(三)

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们