【排列组合】【直通BAT算法精讲】卡特兰数

卡特兰数的理解

1.【排列组合题】有N对括号,输出所有合法的组合

  • 总排列数
    左括号数为n,右括号数为n,可以得到总排列数为C(2n, n)
    上式可以理解为:从2n个位置里选择n个左括号填入。

  • 不合法的组合
    记左括号(1,右括号)-1,在n = 3的时候观察下面一种情况:

    ( ) ) ( ( )对应的表示为序列1 -1 -1 1 1 -1

    其中,“( ) )”——也就是“1 -1 -1”这一部分,是第一次出现右括号比左括号多的片段。将这一部分做翻转,得到序列 -1 1 1 1 1 -1,是一个由3-1-13+11组成的。

    可以证明,每一个非法的排列通过如上的变换方式,可以得到n-1-1n+11所组成的排列。(证明略)

    而且,也可以证明,每一个n-1-1n+11所组成的排列通过上述变换的逆变换,可以得到与之对应的唯一非法排列。也就是说,二者是一一对应的。因此,可以导出:

    所有不合法的排列数
    = n+1个1和n-1个-1组成的排列数
    = C(2n, n+1)或者C(2n, n-1)

  • 合法的组合
    由上一点的结论可以得出:
    所有合法的排列数
    = 总排列数 - 所有不合法的排列数
    = C(2n, n) - C(2n, n+1)
    = [1/(n+1)] * C(2n, n)

  • 卡特兰数重要的公式之一:
    C(2n, n) - C(2n, n+1) = [1/(n+1)] * C(2n, n)

2.【排列组合题】n个数进出栈问题

n个数进出栈的顺序有多少种?假设栈的容量无限大。
解法和上一个案例相同:
进栈相当于左括号,出栈相当于右括号,所以答案还是卡特兰数:
[1/(n+1)] * C(2n, n)
n就是题干中的n个数

3.【排列组合题】2n个人买票问题

2n个人排队买票,n个人手拿5块钱,n个人手拿10块钱,票价是5块钱一张,每人买一张票,售票员受理没有零钱。问有多少种排队方法可以让售票员顺利卖票。
还是卡特兰数的应用,5块钱相当于左括号,10块钱相当于右括号,答案还是卡特兰数:
[1/(n+1)] * C(2n, n)
n就是题干中的n个人

4.【排列组合题】求n个无差别的节点构成的二叉树有多少种不同的结构

假设n个无差别的节点构成的结构数为f(n)
f(0)表示空树,所以规定种数为1种
进行下面的分析:
①以1节点作为头部:结构数1*f(n-1)
②以2节点作为头部:结构数1*f(n-2)
③以3节点作为头部:结构数f(2)*f(n-3)
④以4节点作为头部:结构数f(3)*f(n-4)
……
O O O…O O O (n个节点)
O O O…O O O (n个节点)
O O O O…O O (n个节点)
O O O O O…O (n个节点)
……

总结如下:
初始值满足f(0) = f(1) = 1, f(2) = 2, f(3) = 5
下列结构
f(n) = f(0)*f(n-1) + f(1)*f(n-2) + f(2)*f(n-3) + f(3)*f(n-4) + …… + f(n-1)*f(n)
= [1/(n+1)] * C(2n, n)
——上式为卡特兰数的重要公式2

5.【排列组合题】有12个高矮不同的人排两排问题

有12个高矮不同的人,排成两排,要求:每排必须是从矮到高排列,而且第二排对应比第一排的人高,问排列方式有多少种?
此题又是一个卡特兰数问题,只是隐藏的很深。 我们假设:
0:排在第一排
1:排在第二排
则12个人从低到高排列后,可以用0和1表示,示例如下
在这里插入图片描述
如果前缀(前n个数)出现1比0多的情况,这种排列必然是不合法的。
这时,问题变为任意前缀不能出现1比0多的情况,问题又等价于n组括号合法的问题,答案还是[1/(n+1)] * C(2n, n) ,这里的n是12/2 = 6.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值