96. Unique Binary Search Trees

96. Unique Binary Search Trees

目标 G(n) = 以 1-n 每一个数字为根 F(1,n) + F(2,n) + F(3,n) …. + F(n,n) F(i,n) = G(i-1) * G(n-i) 左右子树种数相乘 (和是 n-1 代表除了根节点的节点个数)

这个式子还能求卡特兰数

int numTrees(int n) {
    vector<int> dp(n+1, 0);
    dp[0]=dp[1]=1;

    for(int i=2;i<=n;++i) {
        for(int j=1;j<=i;++j) {
            dp[i]+=dp[j-1]*dp[i-j];
        }
    }

    return dp[n];
}

卡特兰数

递推序列特征 n = 0: 1 n = 1: 1 n = 2: 2 n = 3: 5 n = 4: 14 n = 5: 42 n = 6: 132

本质上都可以等价到出入栈问题上 1)出栈次序问题

  • n个数有多少种不同的进出栈顺序?
    • n辆火车有多少种不同进出站顺序?

2)加括号问题

  • n对括号有多少种匹配方式?
    • n+1个数相乘,有多少种乘法顺序?(要加n对括号)

3)二叉树问题

  • 给定n个节点,能构成多少种不同的二叉树?
    • 已知二叉树的前序,求所有可能的中序遍历有多少种?

4)排队顺序问题

  • 有2n个人排成一行进入剧场。入场费5元。其中n个人只有5元钞票,n个人只有10元钞票(必须找零),剧院无其它钞票,问有多少种买票顺序能让每个人都顺利买票(其实就是一个括号匹配问题)

#math