Leet Code -- Unique BST

对于数字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];
    }
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 00:59:09

Leet Code -- Unique BST的相关文章

#Leet Code# Unique Tree

语言:Python 描述:使用递归实现 1 class Solution: 2 # @return an integer 3 def numTrees(self, n): 4 if n == 0: 5 return 0 6 elif n == 1: 7 return 1 8 else: 9 part_1 = self.numTrees(n-1) * 2 10 part_2 = 0 11 12 for i in range(1,n-1): 13 part_left = self.numTrees(

#Leet Code# Unique Path

描述: 使用了递归,有些计算是重复的,用了额外的空间,Version 1是m*n Bonus:一共走了m+n步,例如 m = 2, n = 3 [#, @, @, #, @],所以抽象成数学问题,解是C(m + n, m) 代码: 1 class Solution: 2 # @return an integer 3 def __init__(self): 4 self.record = {} 5 6 def uniquePaths(self, m, n): 7 if m == 0 or n ==

#Leet Code# Evaluate Reverse Polish Notation

描述:计算逆波兰表达法的结果 Sample: ["2", "1", "+", "3", "*"] -> ((2 + 1) * 3) -> 9 ["4", "13", "5", "/", "+"] -> (4 + (13 / 5)) -> 6 使用stack实现: 1 def is_op

leet code Sort List

*/--> pre.src {background-color: Black; color: White;} pre.src {background-color: Black; color: White;} leet code Sort List 对链表使用快慢指针归并排序 Sort List Sort a linked list in O(n log n) time using constant space complexity. /** * Definition for singly-lin

#Leet Code# Sqrt

描述:log(n) 代码: 1 class Solution: 2 # @param x, an integer 3 # @return an integer 4 def getVal(self, begin, end, x): 5 if end == begin : 6 return begin 7 if end == begin + 1: 8 return begin 9 10 while True: 11 mid = (begin + end) / 2 12 tmp = mid * mid

【Leet Code】Palindrome Number

Palindrome Number Total Accepted: 19369 Total Submissions: 66673My Submissions Determine whether an integer is a palindrome. Do this without extra space. 判断一个数整数是不是回文?例如121,1221就是回文,好吧,直接利用前面写过的[Leet Code]Reverse Integer--"%"你真的懂吗? 不过这里要考虑翻转后,数值

Leet Code OJ 119. Pascal&#39;s Triangle II [Difficulty: Easy]

题目: Given an index k, return the kth row of the Pascal's triangle. For example, given k = 3, Return [1,3,3,1]. Note: Could you optimize your algorithm to use only O(k) extra space? 翻译: 给定一个下标k,返回第k行的杨辉三角. 例如给定k=3,返回[1,3,3,1]. 提示:你可以优化你的算法,让它只使用O(k)的额

#Leet Code# Gray Code

描述: 要求相邻数2进制差一位 先获得n-1的列表表示小于 2^(n-1) 的符合要求的列表,加上最高位的加成 2^(n-1) 就是大于等于 2^(n-1) 的符合要求的列表,后者翻转一下就能够与前者连接上了 代码: 1 class Solution: 2 # @return a list of integers 3 def grayCode(self, n): 4 if n == 0: return [0] 5 6 s1 = self.grayCode(n - 1) 7 s2 = [item

Leet Code OJ 118. Pascal&#39;s Triangle [Difficulty: Easy]

题目: Given numRows, generate the first numRows of Pascal's triangle. For example, given numRows = 5, Return [ [1], [1,1], [1,2,1], [1,3,3,1], [1,4,6,4,1] ] 翻译: 给定一个数numRows,产生前numRows行的杨辉三角(即贾宪三角形.帕斯卡三角形). 分析: 除了每行首尾是1以外,其他元素均可由上行推出,本方案采用lastLine保存上行数