Description
https://leetcode.com/problems/unique-binary-search-trees/
给定n,求结构上唯一的二叉搜索树的总数。
Solving Ideas
https://www.youtube.com/watch?v=YDf982Lb84o
动态规划:
State:
dp[i]
: 表示i
个结点所能构造出结构上唯一的二叉搜索树的总数。
如:dp[3] = 5
表示3个结点能构造出5棵结构上唯一的BST
Initial State:
dp[0] = 1
dp[1] = 1
State Transition:
对于i >= 2 && i <= n
有:
dp[i] += dp[j - 1] * dp[i - j] (j >= 0 && j <= i)
也即:
d
p
[
i
]
=
∑
j
=
1
j
≤
i
d
p
[
j
−
1
]
d
p
[
i
−
j
]
i
ϵ
[
2
,
n
]
dp[i] = \sum_{j=1}^{j\leq i} dp[j-1]dp[i-j] \qquad i\ \epsilon \ [2,n]
dp[i]=j=1∑j≤idp[j−1]dp[i−j]i ϵ [2,n]
例如:n = 4
,序列为[1, 2, 3, 4]
,因为序列中的每个元素都可以作为root,则
dp[4] = dp[0]*dp[3] + dp[1]*dp[2] + dp[2]*dp[1] + dp[3]*dp[0]
其中dp[0]*dp[3]
表示在以序列中第一个元素为root,其左边为左子树,其右边为右子树的情况下,所能构造出的结构唯一的BST的数量。
同理可知dp[1]*dp[2]
是以第二个元素为root,其余类似。
时间复杂度:
O
(
n
2
)
O(n^2)
O(n2)
空间复杂度:
O
(
n
)
O(n)
O(n)
Solution
class Solution {
public int numTrees(int n) {
int[] dp = new int[n + 1];
dp[0] = 1;
dp[1] = 1;
for (int i = 2; i <= n; i++) {
for (int j = 1; j <= i; j++) {
dp[i] += dp[j - 1] * dp[i - j];
}
}
return dp[n];
}
}