这道题其实跟二叉搜索树没有什么关系,给定n个节点,让你求有多少棵二叉树也是完全一样的做法。思想是什么呢,给定一个节点数x,求f(x),f(x)跟什么有关系呢,当然是跟他的左右子树都有关系,所以可以利用其左右子树的结论,大问题被成功转化成了小问题。最熟悉的方法是递归和dp,这里显然有大量的重复计算,用dp打表好一些。
后来实验的同学说,这其实是一个Catalan数,上网查了一下,果然啊。Catalan数是这样子的:
h(0) = 1, h(1) = 1;
递推式:h(n)= h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
解为:h(n)=C(2n,n)/(n+1)
(n=0,1,2,...)
其中数列的前几项是:1,2,5,14,42,很多公司的笔试题都会问这个,一般是到5。知道了通项公式,直接秒杀。
Catalan数的应用当然不止求树的个数,还有很多。算法考试中最难的一个题,问在多边形中放入不相交的对角线,一共有多少种不同的分法,请根据矩阵相乘的方法来想。矩阵相乘在课堂上讲过,是在一连串的矩阵乘法中添加括号,使实际的乘法数最少。原来都可以用Catalan数来解。
class Solution { public: int numTrees(int n) { vector<int> res(n+1, 0); res[0] = 1; for(int i=1;i<=n;i++){ for(int j=0;j<i;j++){ res[i] += res[j]*res[i-j-1]; } } return res[n]; } };
leetcode第一刷_Unique Binary Search Trees
时间: 2024-12-28 23:58:44