对于数字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. Partition List leetcode java

    题目: Given a linked list and a value x, partition it such that all nodes less than x come before node ...

  2. JQuery巧妙利用CSS操作打印样式

    一.添加打印样式 1. 为屏幕显示和打印分别准备一个css文件,如下所示:  用于屏幕显示的css: <link rel="stylesheet" href="cs ...

  3. js复制当前url地址解决浏览器兼容

    1.网上搜索的js复制链接代码,好像只能支持ie浏览器,其他浏览器不支持, 案例: var url=12; if(window.clipboardData){                   wi ...

  4. Python访问MongoDB数据库

    #encoding: utf-8 __author__ = 'Administrator' #import pymongo from pymongo import MongoClient,GEO2D ...

  5. 刀片服务器和磁盘阵列卡(RAID)技术---永和维护(转)

    近期客户需要更换服务器,客户把买好的服务器送来了,原本感觉很小的一个服务器,可当我看到的时候是一个大个的又长又宽,类似机房服务器的那种,后来米老师给大致讲解一番:这个是刀片服务器. 刀片服务器是指在标 ...

  6. select设置高度的兼容问题

    在IE678下,我们给select设置高度的话,里面的option无法居中,折中的兼容方式就是,我们给select的border:0:外面套一层div,这个div给他设置padding,让select ...

  7. VS2010已停止工作,framework 4.0安装失败

    好久没在台式机上写程序了,今天打开一个解决方案,报错: 从来没有遇到这种情况,重新关闭解决方案,在菜单栏中打开解决方案说没有framework 4.0,其实我安装的是4.5 ,也有4.0,于是全部卸载 ...

  8. 漫谈单点登录(SSO)(淘宝天猫)(转载)

    1. 摘要 ( 注意:请仔细看下摘要,留心此文是否是您的菜,若浪费宝贵时间,深感歉意!!!) SSO这一概念由来已久,网络上对应不同场景的成熟SSO解决方案比比皆是,从简单到复杂,各式各样应有尽有!开 ...

  9. uva 10721 - Bar Codes(dp)

    题目链接:uva 10721 - Bar Codes 题目大意:给出n,k和m,用k个1~m的数组成n,问有几种组成方法. 解题思路:简单dp,cnt[i][j]表示用i个数组成j, cnt[i][j ...

  10. [C++设计模式]template 模板方法模式

    模板法模式:定义一个操作中的算法骨架.而将一些步骤延迟到子类中. 依照<headfirst 设计模式>的样例.煮茶和煮咖啡的算法框架(流程)是一样的.仅仅是有些算法的实现是不一样的,有些是 ...