lintcode-不同的二叉查找树

  • 卡特兰数

    Catalan数是组合数学中一个常出现在各种计数问题中出现的数列。由以比利时的数学家欧仁·查理·卡塔兰 (1814–1894)命名。
      原理:
      令h(0)=1,h(1)=1,catalan数满足递归式:
      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=1,2,3,)
    另类递归式: h(n)=((4n-2)/(n+1))h(n-1);

unsigned long long fact(int n, int k) {
        if(k > 0) {
            if(n == 0 && n == 1) {
                return 1;
            } else {
                return n * fact(n-1, k-1);
            }
        } else {
            return 1;
        }
        
    }
    
    int numTrees(int n) {
        // write your code here
        return (int)(fact(2*n, n) / fact(n, n) / (n+1));
    }
  • 动态规划
class Solution {
public:
    /**
     * @paramn n: An integer
     * @return: An integer
     */
     
    
    int numTrees(int n) {
        
        vector dp(n+1, 0);
        dp[0] = dp[1] = 1;
        
        for(int i = 2; i <= n; ++i) {
            for(int j = 0; j <= i-1; ++j) {
                dp[i] += dp[j]*dp[i-1-j];
            }
        }
        
        return dp[n];
        
    }
};

你可能感兴趣的:(lintcode-不同的二叉查找树)