美文网首页动态规划
96 Unique Binary Search Trees

96 Unique Binary Search Trees

作者: jluemmmm | 来源:发表于2019-01-07 18:56 被阅读1次

给定n,判断有多少不同的二叉搜索树。

二叉搜索树,若左子树不空,左子树上的所有节点的值均小于根节点的值,若右子树不空,则右子树上所有节点值均大于根节点值。它的左右子树也分别为二叉搜索树。

有1~n构建二叉搜索树,以i为根节点,左子树由[1, i - 1]构成,右子树由[i + 1, n]构成。

定义dp(x)为以[1, x]构成的二叉搜索树的数目。
n = 0, dp(0) = 0
n = 1, dp(1) = 1
n = 2, dp(2) = dp(0) * dp(1) + dp(1) * dp(0)
n = 3, dp(3) = dp(0) * dp(2) + dp(1) * dp(1) + dp(2) * dp(0)
dp(n) = dp(0) * dp(i - 1) +... + dp(k - 1) * dp(i - k) + dp(i - 1) * dp(0)

得到递推公式
dp[i] += (dp[j - 1]) * (dp[i - j]);

/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function(n) {
    var dp = Array(n + 1).fill(0)
    dp[0] = 1
    for(var i = 1; i <= n; i++){
        for(var j = 1; j <= i; j++){
            dp[i] += dp[j - 1] * dp[i - j]
        }
    }
    return dp[n]
};

这种求数量的题目一般都容易想到用动态规划的解法,这道题的模型正好是卡特兰数的定义,faster than 100%


image.png
/**
 * @param {number} n
 * @return {number}
 */
var numTrees = function(n) {
    var res = 1
    if(n === 0) return res
    for(var i = 1; i <= n; i++){
        res = res * 2 * (2 * i - 1) / (i + 1)
    }
    return res
};

相关文章

网友评论

    本文标题:96 Unique Binary Search Trees

    本文链接:https://www.haomeiwen.com/subject/jzfurqtx.html