对于数字n(大于1)。从1到n有多少种binary search tree(BST序列)?
当n=3时,BST序列为:

1         3     3    2     1
     \         /     /      / \      \
     3      2    1    1  3     2
     /       /       \                  \
   2      1         2                3
共5种。

分析:

N=1时,BST 序列为
 1
 /   \
      null  null
1种

N=2时,BST 序列为
1        2
 \        /

2    1

2种

N=3时。BST序列为
   1         3     3      2      1
     \         /     /       / \       \
     3     2     1      1   3      2
    /       /        \                    \
   2     1         2                    3
5种

N=4时。BST序列为
1                                                        4                      2                                          3
 \             +                                        /                 +    / \                             +          / \
 2,3,4(5种)                              1,2,3(5种)   (1种)1  3,4 (2种)              (2种)1 ,2    4(1种)
共  5+5+1*2+2*1 = 14种

N=5时。BST序列为

1                                              2                                                  3                                                     4

\                                             / \                                                 /  \                                                  /  \                                    

2,3,4,5(14种)             (1种)1   3,4,5(5种)           (2种)1,2  4,5(2种)               (5种)1,2,3  5(1种)

5

/

1,2,3,4(14种)

因此,count(5) = 14 + 1*5 + 2*2 + 5*1 + 14 = 42种

看上去存在一种递推关系。考虑DP来解。
找规律。求递推公式:
设S(n)为n相应的情况数,S(0)=1 ,则。
S(1) = 1
S(2) = 2
S(3) = S(0) * S(2) + S(1) * S(1) + S(2) * S(0) = 5
S(4) = S(0) * S(3) + S(1) * S(2) + S(2) * S(1) + S(3) * S(0) = 14

不难发现,
S(N) = Sum{S(K-1) * S(N-K) ,当中K∈[1,N]}

得到了递推公式,下一步就是写代码了:

public class Solution {
public int NumTrees(int n) {
if(n <= 0) {
return 1;
} // - dp array
var dp = new int[n+1];
dp[0] = 1;
dp[1] = 1; for(var j = 2; j <= n; j++){
// i: 1.. j
// dp[j] = sum (dp[i-1] * dp[j-i])
var s = 0;
for(var i = 1; i <= j; i++){
s += dp[i-1] * dp[j-i];
} dp[j] = s;
} return dp[n];
}
}

Leet Code -- Unique BST的更多相关文章

  1. #Leet Code# Unique Path(todo)

    描述: 使用了递归,有些计算是重复的,用了额外的空间,Version 1是m*n Bonus:一共走了m+n步,例如 m = 2, n = 3 [#, @, @, #, @],所以抽象成数学问题,解是 ...

  2. #Leet Code# Unique Tree

    语言:Python 描述:使用递归实现 class Solution: # @return an integer def numTrees(self, n): : elif n == : else: ...

  3. 【Leet Code】Palindrome Number

    Palindrome Number Total Accepted: 19369 Total Submissions: 66673My Submissions Determine whether an ...

  4. Leet Code 771.宝石与石头

    Leet Code编程题 希望能从现在开始,有空就做一些题,自己的编程能力太差了. 771 宝石与石头 简单题 应该用集合来做 给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头. S  ...

  5. #Leet Code# Gray Code

    描述: 要求相邻数2进制差一位 先获得n-1的列表表示小于 2^(n-1) 的符合要求的列表,加上最高位的加成 2^(n-1) 就是大于等于 2^(n-1) 的符合要求的列表,后者翻转一下就能够与前者 ...

  6. #Leet Code# Permutation

    描述: 输出全排列 代码: class Solution: # @param num, a list of integer # @return a list of lists of integers ...

  7. #Leet Code# Populating Next Right Pointers in Each Node II

    描述:注意需要先self.connect(right)再self.connect(left),否则会有case通不过,原因是左边递归执行时依赖与右边的next已经建立,而先执行connect(left ...

  8. #Leet Code# Sqrt

    描述:log(n) 代码: class Solution: # @param x, an integer # @return an integer def getVal(self, begin, en ...

  9. #Leet Code# Best Time to Buy and Sell Stock

    描述:数组 A,对于 i < j, 找到最大的 A[j] - A[i] 代码: class Solution: # @param prices, a list of integer # @ret ...

随机推荐

  1. 你应该抓紧学习Python,它是开发Web应用最强大的语言

    Python和少数几种编程语言,如MySQL.Perl.PHP和与LAMP打包的网络结构一起的Apache,已经成为Linux的一个基本组件.即 使从它诞生开始,Python就与其他动态编程语言如Ru ...

  2. C#中Serializable序列化

    序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或 ...

  3. C# 音频操作系统项目总结

    此项目需求是针对.wav格式音频进行操作,转换成相应的.mp3格式的音频文件,对音频进行切割,最后以需求的形式输出,此篇会回顾运用到的一些知识点. 1.MDI子窗口的建立: 首先一个窗体能够创建多个M ...

  4. statickeyword

    static词义:静态的,可以用于修饰变量和方法,static方法块可以优先于构造函数运行. 被static修饰的变量,叫静态变量,静态变量在内存中仅仅有一份拷贝 public static Stri ...

  5. Leaf - 一个由 Go 语言编写的开发效率和执行效率并重的开源游戏服务器框架

    转自:https://toutiao.io/posts/0l7l7n/preview Leaf 游戏服务器框架简介 Leaf 是一个由 Go 语言(golang)编写的开发效率和执行效率并重的开源游戏 ...

  6. RAID5工作原理介绍

    RAID 5是一种存储性能.数据安全和存储成本兼顾的存储解决方案.以四个硬盘组成的RAID 5为例,其数据存储方式如图4所示:图中,P0为D0,D1和D2的奇偶校验信息,P1为D3,D4,D5的奇偶校 ...

  7. tomcat thread dump 分析

    前言 Java Thread Dump 是一个非常有用的应用诊断工具, 通过thread dump出来的信息, 可以定位到你需要了解的线程, 以及这个线程的调用栈. 如果配合linux的top命令, ...

  8. lftp mirror 上传目录

    1. lftp的确很强大, 要学习一下.       sudo yum install lftp       (测试了一下,ftp软件才92K,lftp有2.3M) 2. lftp mirror 能上 ...

  9. HDU Always Cook Mushroom (极角排序+树状数组)

    Problem Description Matt has a company, Always Cook Mushroom (ACM), which produces high-quality mush ...

  10. exception PLS-00215: String length constraints must be in range (1 .. 32767)

      exception PLS-00215: String length constraints must be in range (1 .. 32767) CreationTime--2018年8月 ...