LeetCode 96.Unique Binary Search Trees
Given n, how many structurally unique BST’s (binary search trees) that store values 1…n?
For example,
Given n = 3, there are a total of 5 unique BST’s.
1 3 3 2 1
\ / / / \ \
3 2 1 1 3 2
/ / \ \
2 1 2 3
public int numTrees(int n) {
int []G=new int[n+1];
G[0]=1;
G[1]=1;
for(int i=2;i<=n;i++){ //代表G(2)............G(n),因为求G(n)必须知道G(0)....G(n-1)
for(int j=1;j<=i;j++){ //代表以j为根的BST。
G[i]+=G[j-1]*G[i-j];
}
}
return G[n];
}
代码很简单,但思路很难想到,此题的本质上是卡塔兰数;假设G(n)是n个数字能构成的独特的BST的数目,F(i,n)以数字i为根节点的BST的数目,则G(n)=F(1,n)+F(2,n)+F(3,n)+F(4,n)+…….+F(n,n),对于以数字i为根的BST的数目=它的左子树个数*右子树个数,例如F(3,7),在[1,2,3,4,5,6,7]中,F(3,7)是[1,2]和[4,5,6,7]能构成的BST数目的乘积,即F(3,7)=G(2)*G(4),即F(i,n)=G(i-1)*G(n-i);
所以能得到式子:G(n)=G(0)*G(n-1)+G(1)*G(n-2)+…..G(n-1)*G(0);该式子也是卡塔兰数的计算公式因此G(n)的值取决于G(0)……G(n-1)的值,是动态规划题;leetCode讨论部分置顶回答对此思路进行了非常完美的解答。
开始虽然看leetcode英文解释理解了整个思路,但是还是不明白怎么转换为上述代码,太菜啦,模拟了一遍过程才明白。
i=2,j=1,F(1,2)=G(0)*G(1)=1;
j=2,F(2,2)=G(1)*G(0)=1;
G(2)=F(1,2)+F(2,2)=2;
i=3,j=1,F(1,3)=G(0)*G(2)=2;
j=2,F(2,3)=G(1)*G(1)=1;
j=3,F(3,3)=G(2)*G(0)=2;
所以概括为G(n)+=G(j-1)*G(i-1);