卡特兰数编程应用

问题1

假设有n对左右括号,请求出合法的排列有多少个?合法是指每一个括号都可以找到与之配对的括号,比如n=1时,()是合法的,但是)(为不合法。

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

测试样例:
1
返回:1


问题2

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

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

测试样例:
1
返回:1


问题3

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

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

测试样例:
1
返回:1


问题4

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

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

测试样例:
1
返回:1


问题5

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

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

测试样例:
1
返回:1

class Parenthesis {
public:
    int countLegalWays(int n) {
        if(n==1)
            return 1;
        int sum=1;
        for(int i=n+2;i<=2*n;++i)
            sum*=i;
        for(int i=1;i<=n;++i)
            sum/=i;
        return sum;
    }
};

问题6

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

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

测试样例:
2
返回:1
注意防止溢出

class CombineByMistake {
public:
    int countWays(int n) {          
        if(n==1)
            return 0;
        if(n==2)
            return 1;
        long long pre=0;
        long long before=1;
        long long cur;
        for(int i=3;i<=n;++i)
            {
            cur=(i-1)*(pre+before)%1000000007;
            pre=before;
            before=cur;
        }
        return cur;
    }


};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值