zoukankan      html  css  js  c++  java
  • 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];
        		}
    };


  • 相关阅读:
    php 全局变量 2
    PHP 全局变量 1
    巧用sublime
    ini_get和ini_set
    sublime安装sftp
    常用数组函数
    二维数组去重
    判断常量
    system(),exec() ,passthru()
    【收集】Python 微优化
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5408290.html
Copyright © 2011-2022 走看看