leetcode第一刷_Unique Binary Search Trees

这道题事实上跟二叉搜索树没有什么关系,给定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];
    		}
};


原文地址:https://www.cnblogs.com/yxwkf/p/5408290.html