码迷,mamicode.com
首页 > 其他好文 > 详细

leetcode第一刷_Unique Binary Search Trees

时间:2014-05-09 14:47:53      阅读:229      评论:0      收藏:0      [点我收藏+]

标签:c++   leetcode   算法   

这道题其实跟二叉搜索树没有什么关系,给定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,布布扣,bubuko.com

leetcode第一刷_Unique Binary Search Trees

标签:c++   leetcode   算法   

原文地址:http://blog.csdn.net/u012792219/article/details/25368201

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!