N个数依次入栈,出栈顺序有多少种

转载:https://blog.csdn.net/u010255818/article/details/62044402

题目
N个数依次入栈,出栈顺序有多少种?

直接公式
令h(0)=1,h(1)=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)=C(2n,n)/(n+1) (n=1,2,3,...) 
递推关系的另类解为:h(n)=C(2n,n)-C(2n,n+1)(n=1,2,3,...)

常规分析
1) 首先,我们设f(n)代表序列个数为n的出栈序列种数。同时,我们假定第一个出栈的序数是k。 

2) 第一个出栈的序数k将1~n的序列分成两个序列:其中一个是1~k-1,序列个数为k-1;另外一个是k+1~n,序列个数是n-k。 

3) 此时,我们若把k视为一个确定的序数,那么根据乘法原理,f(n)的问题就等价于序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的出栈组合为f(k-1)×f(n-k)。 

4) 而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为: 
f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。 

5) 看到此处,再看看卡特兰数的递推式,答案不言而喻,即为: 
f(n)=h(n)=C(2n,n)/(n+1)=C(2n,n)-C(2n,n+1), (n=1,2,3,……)。最后,令f(0)=1,f(1)=1。
 

你可能感兴趣的:(面试)