互联网内推LeetCode

96. 不同的二叉搜索树

2018-10-24  本文已影响0人  小王同学加油

题目描述

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

image.png

分析过程

这是结果 image.png

代码实现

//unique-binary-search-trees
//Time  complexity: O(n*n)
//Space complexity: O(n)
func numTrees(n int) int {
    dp := make([]int, n+1)

    dp[0] = 1
    dp[1] = 1
    //计算每个n的结果
    for i := 2; i <= n; i++ {
        for j := 0; j < i; j++ {
            dp[i] += dp[j] * dp[i-1-j]
        }
    }
    return dp[n]
}

//递归
func numTrees1(n int) int {
    dp := make([]int, n+1)
    return getCountsBst(dp, n)
}

func getCountsBst(dp []int, n int) int {

    if n == 0 || n == 1 {
        return 1
    }
    if dp[n] > 0 {
        return dp[n] //已经计算过
    }

    for i := 0; i < n; i++ {
        //{0....i....n-1} 元素i把数据分为小于i 和大于i的2部分
        dp[n] += getCountsBst(dp, i) * getCountsBst(dp, n-1-i)
    }

    return dp[n]
}

收获

寻找变化 从零开始的变化

上一篇下一篇

猜你喜欢

热点阅读