n个数顺序入栈后的出栈顺序

4 篇文章 0 订阅
4 篇文章 0 订阅
解法①:递推法
有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).
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值