96. 不同的二叉搜索树
2018-10-24 本文已影响0人
小王同学加油
题目描述
给定一个整数 n,求以 1 ... n 为节点组成的二叉搜索树有多少种?
image.png分析过程
- 演示n的变化过程
代码实现
- go dp 实现
//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]
}
- go递归实现
//递归
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]
}
收获
寻找变化 从零开始的变化