关闭

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

229人阅读 评论(0) 收藏 举报
分类:

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


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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:2663次
    • 积分:180
    • 等级:
    • 排名:千里之外
    • 原创:16篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档