解法①:递推法
有n个位置,现在任意选定一个数,比如1,那么1可以在1-->n的任意一个位置上。假设1在第k的位置上,显然在1的前面有k-1个数,并且这些数的数值为2-->k,在1后面有n-k个数。用f(k)表示k个数顺序入栈后的出栈顺序,则f(n)就是我们要求的最终答案。而f(n)这个事件又可以分解成1在1-->n这n个位置上出现的n种情况,于是根据加法/乘法原理,易得f(n)is Catalan number.
解法②:递归法
在入栈和出栈过程中,任意一个元素有3种情况:已在序列中/等待进栈/已进栈。于是用f(k,m)表示
有k个数等待进栈,m个数已进栈。f(n,0)=f(n-1,1) ;
f(n-1,1)=f(n-1,0)+f(n-2,2)....
解法③:组合数学
对于一个数来说,只有入栈和出栈两种操作,记入栈为1,出栈为0.共n个数,因此有2n种操作,n个0,n个1,因此全排列有C(n,2n)种,再去掉不符合要求的数:从左向右扫描出现0的累计数超过1的累计数。必然在摸一个奇数位上2m+1位上首先出现m+1个0累计数和m个1累计数,此后的2n-(2m+1)位子有n-m个1,n-m-1个0.若把
2n-(2m+1)0与1交换,使之成为n-m个0,n-m个1.则整个序列就变成:n+1个0,n-1个1组成的2n位数。即一个不合要求的数对应于一个由n-1个0,n+1个1组成的一个排列。所以答案就是
C(n,2n)-C(n+1,2n).