LeetCode 96 不同的二叉搜索树[数学 动态规划] HERODING的LeetCode之路

Posted HERODING23

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 96 不同的二叉搜索树[数学 动态规划] HERODING的LeetCode之路相关的知识,希望对你有一定的参考价值。

在这里插入图片描述解题思路:
使用动态规划的方法需要分析长度为i的二叉搜索树个数的组成,即以1——i为根节点的二叉搜索树个数之和!那么状态转移方程就可以轻松构建了,dp[i] += dp[j - 1] * dp[i - j];代码如下:

class Solution {
public:
    int numTrees(int n) {
        vector<int> dp(n + 1);
        // 空和单节点情况都是1
        dp[0] = 1;
        dp[1] = 1;
        for(int i = 2; i <= n; i ++) {
            for(int j = 1; j <= i; j ++) {
                // 长度为 i 的二叉搜索树个数等于1——i为根节点的二叉搜索树的和
                dp[i] += dp[j - 1] * dp[i - j];
            }
        }
        return dp[n];
    }
};

第二种方法是利用数学公式,在数学上称为卡塔兰数,这种方法更高效,但是很难想到,以下是公式:
在这里插入图片描述

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

以上是关于LeetCode 96 不同的二叉搜索树[数学 动态规划] HERODING的LeetCode之路的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode Java刷题笔记— 96. 不同的二叉搜索树

LeetCode Java刷题笔记— 96. 不同的二叉搜索树

LeetCode 96. 不同的二叉搜索树 | Python

Leetcode 96. 不同的二叉搜索树

Leetcode 96.不同的二叉搜索树

leetcode 96. 不同的二叉搜索树