参考博文如下列出
https://blog.csdn.net/wookaikaiko/article/details/81105031
https://www.jianshu.com/p/26925a2fc5e7
什么是卡特兰数
卡特兰数满足一下的性质:
令 ,卡特兰数满足递推式:
有计算通式
栗子
腾讯实习招聘笔试题
在图书馆一共6个人在排队,3个还《面试宝典》一书,3个在借《面试宝典》一书,
图书馆此时没有了面试宝典了,确保三个人都能借到书,求他们排队的总数?
解题思路:
3个还书的人可以有 3!种顺序.
3个借书的人同样有 3!种顺序.
图书馆没有书,那必须保证还书的数量不少于借书的数量,这样的排序组合数。
我们将还书的人以0标记,借书的人以1标记,那么这样的组合有:
000111 001011 001101 010011 010101
所以最终的答案就是
;
阿里巴巴的笔试题目:
说16个人按顺序去买烧饼,其中8个人每人身上只有一张5块钱,另外8个人每人身上只有一张10块钱。烧饼5块一个,开始时烧饼店老板身上没有钱.16个顾客互相不通气,每人只买一个。问这16个人共有多少种排列方法能避免找不开钱的情况出现。
由上面的一题我们知道,答案是
,
其中这个n如何求解呢?
可以抽象为8个0,8个1的从左到右数,确保在当前数的前面,出行的0的次数不少于1的次数的组合数。
进出栈问题
那么一个足够大的栈的进栈序列为1,2,3,⋯,n时有多少个不同的出栈序列?
对于一组数 1,2,3,4,5,…,k.,…,n
假设最后出栈的元素为k
过程一:那么k之前有 k-1个数比k小,对于这k-1个数,在k入栈之前,已经入栈且出栈,栈混洗可能的结果是
。
过程二:那么k之后有 n-k个数比k大,对于这n-k个数,在k出栈之前,已经入栈且出栈,栈混洗可能的结果是
。
这两个过程独立,对于此时的k,可能的排列有
种。
又因为 k的取值为1,2,3,…,n。所以有:
显然,其满足卡特兰数。
二叉树构成问题
有n个结点,问总共能构成几种不同的二叉树
我们可以假设,如果采用中序遍历的话,根结点第k个被访问到,则根结点的左子树有k-1个点、根结点的右指数有n-k个点。k的取值范围为1到n。讲到这里就很明显看得出是卡特兰数了。
有n+1个叶子的满二叉树的个数?
事实上,向左记为+1,向右记为−1,按照向左优先的原则,从根节点开始遍历.例如第一个图记为+1,+1,+1,−1,−1,−1,于是由卡特兰数的含义可得满二叉树的个数为卡特兰数
凸多边形的三角形划分
一个凸的n边形,用直线连接他的两个顶点使之分成多个三角形,每条直线不能相交,问一共有多少种划分方案。
这也是非常经典的一道题。我们可以这样来看,选择一个基边,显然这是多边形划分完之后某个三角形的一条边。图中我们假设基边是p1pn,我们就可以用p1、pn和另外一个点假设为pi做一个三角形,并将多边形分成三部分,除了中间的三角形之外,一边是i边形,另一边是n-i+1边形。i的取值范围是2到n-1。所以本题的解即为
,满足卡特兰数。
在n*n的格子中,只在下三角行走,每次横或竖走一格,有多少中走法?
其实向右走相当于进栈,向左走相当于出栈,本质就是n个数出栈次序的问题,所以答案就是卡特兰数。
引理
n+1个数连乘,不同的乘法顺序数为卡特兰数
考虑:由n对括号形成的合法的表达式的个数
如n=3时,先取4个数1,2,3,4,然后在第一个数下设一个指针,将一个左括号看成是指针右移一格,而将右括号看成是将指针当前指向的数与其左侧的一个数作乘积,并删除左侧的那个数,那么当执行完括号表达式,就得到了一种可能的相乘顺序,如图.