最近在做腾讯笔试题的时候,碰到一个排列问题:
找工作的季节马上就到了,很多同学去图书馆借阅《面试宝典》这本书,现在图书馆外有6名同学排队,其中3名同学要将手中的《面试宝典》还至图 书馆,有3名同学希望从图书馆中可以借到《面试宝典》,若当前图书馆内已无库存《面试宝典》,要保证借书的3名同学可以借到书,请问这6位同学有多少种排 队方式()
A)60
B)120
C)180
D)360
答案是C。自己做的时候是分情况讨论的,虽然答案是对的,但是很麻烦。然后在网上看到别人说是卡特兰数题型,解法如下:
C(n,2n)/(n+1),n是入栈元素的个数,这里n=3,C(3,6)/4=5,同学彼此是不同的,因此要全排列一下,结果为5*3!*3!=180。
我之前从没听过卡特兰数,特意学习了一下,先做一下总结。
卡特兰数,一种有着特殊规律的数列
令h(0)=1,h(1)=1,catalan数满足递推式[1] :
h(n)=h(0)*h(n-1)+h(1)*h(n-2) + ... + h(n-1)h(0) (n>=2)
例如:h(2)=h(0)*h(1)+h(1)*h(0)=1*1+1*1=2
h(3)=h(0)*h(2)+h(1)*h(1)+h(2)*h(0)=1*2+1*1+2*1=5
h(n)=h(n-1)*(4*n-2)/(n+1);
递推关系的解为:
h(n)=C(2n,n)/(n+1)(n=0,1,2,...)
递推关系的另类解为:
h(n)=c(2n,n)-c(2n,n-1)(n=0,1,2,...)
卡特兰数的证明方法:折线法
现在只要减去跨越了x轴的情况数。对于任意跨越x轴的情况,必有将与y=-1相交。找出第一个与y=-1相交的点k,将k点以右的折线根据y=-1对称(即操作1与操作2互换了)。可以发现终点最终都会从(2n,0)对称到(2n,-2)。由于对称总是能进行的,且是可逆的。我们可以得出所有跨越了x轴 的折线总数是与从(0,0)到(2n,-2)的折线总数。而后者的操作2比操作1要多0-(-2)=2次(因为前者终点是(2n,0),后者终点是(2n,-2))。即操作1为n-1,操作2为n+1。总数为 C(2n,n-1),即在2n次操作中选出n-1次作为操作1的方法数。
卡特兰数的应用例子:
1.将多边行划分为三角形问题。将一个凸多边形区域分成三角形区域(划分线不交叉)的方法数?
2、出栈次序问题。一个栈(无穷大)的进栈序列为1、2、3、...、n,有多少个不同的出栈序列?
类似:有2n个人排成一行进入剧场。入场费5元。其中只有n个人有一张5元钞票,另外n人只有10元钞票,剧院无其它钞票,问有多少中方法使得只要有10元的人买票,售票处就有5元的钞票找零?(将持5元者到达视作将5元入栈,持10元者到达视作使栈中某5元出栈)
3、给顶节点组成二叉树的问题。
给定N个节点,能构成多少种形状不同的二叉树?
(一定是二叉树!先取一个点作为顶点,然后左边依次可以取0至N-1个相对应的,右边是N-1到0个,两两配对相乘,就是h(0)*h(n-1) + h(2)*h(n-2) +...... + h(n-1)h(0)=h(n)) (能构成h(N)个)