牛客网算法学习笔记-卡特兰数相关

来源:互联网 发布:deepin ubuntu 哪个好 编辑:程序博客网 时间:2024/05/01 16:05

说实话,卡特兰数我自己基本没什么深刻的理解,只能做一些相关的简单的题目而已。所以这里只记录题目和代码。


n个数进出栈的顺序有多少种?假设栈的容量无限大。

给定一个整数n,请返回所求的进出栈顺序个数。保证结果在int范围内。

测试样例:
1
返回:1


2n个人排队买票,n个人拿5块钱,n个人拿10块钱,票价是5块钱1张,每个人买一张票,售票员手里没有零钱,问有多少种排队方法让售票员可以顺利卖票。

给定一个整数n,请返回所求的排队方案个数。保证结果在int范围内。

测试样例:
1
返回:1

求n个无差别的节点构成的二叉树有多少种不同的结构?

给定一个整数n,请返回不同结构的二叉树的个数。保证结果在int范围内。

测试样例:
1
返回:1


class Stack {
public:
    int countWays(int n) {
        // write code here
        int result = 1;
        for(int i = n+1;i<=2*n;i++){
            result = result *i;
        }
        for(int i = 1;i<=n;i++){
            result = result/i;
        }
        result = result /(n+1);
        return result;
    }
};


12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?

给定一个偶数n,请返回所求的排列方式个数。保证结果在int范围内。

测试样例:
1
返回:1
不会写。没看出是卡特兰数

别人家的代码:

class HighAndShort {public:    int countWays(int n) {        // write code here        if(n%2)            n--;        int res=1;        for(int i=n;i>n/2;i--)            res*=i;        for(int i=n/2;i>1;i-- )            res/=i;        return res/(n/2+1);    }};


有n个信封,包含n封信,现在把信拿出来,再装回去,要求每封信不能装回它原来的信封,问有多少种装法?

给定一个整数n,请返回装发个数,为了防止溢出,请返回结果Mod 1000000007的值。保证n的大小小于等于300。

测试样例:
2
返回:1
class CombineByMistake {
public:
    int countWays(int n) {
        // write code here
        long a = 0;
        long b = 1;
        if(n==1)
            return a;
        if(n==2)
            return b;
        int result;
        for(int i = 3;i<=n;i++){
            result = (i - 1)*(a + b) %1000000007;
            a = b;
            b = result;
        }
        return result;


    }
};
0 0