先以几个例子来说明卡特兰数问题
例一:
n个数进出栈的顺序有多少种?假设栈的容量无限大。
给定一个整数n,请返回所求的进出栈顺序个数。保证结果在int范围内。
答:n个数进栈、出栈,总共有2n种操作。从其中挑选出n个操作为进栈(注意入栈和出栈操作数目是相等的,只是顺序不同),则总共有 种可能。但是其中必然有一些不合法的进出栈顺序,即栈为空时仍然出栈。假设入栈记为+1,出栈记为-1,当n = 6 一种不合法的入栈出栈顺序可以记为:+1 -1 -1 +1 +1 -1。前3个数的和等于-1。
如果我们将前缀和等于-1的部分取反,那么由于取反前该部分中+1比-1的数目少了一个,所以取反后整个序列中+1的数目比-1多了两个,即变为:-1 +1 +1 +1 +1 -1。于是不合法的进出栈顺序问题变为了:在2n个位置上选取n+1个记为+1,剩下的记为-1,有多少种可能?用总的顺序数减去不合法顺序数,就是合法的顺序数目,即。而合法的进出栈顺序中,出栈时栈必不为空,前缀和不可能小于零,因此找不到一个序列,翻转后+1数目比-1多2。
例二:
一个点从(0,0)出发到达(n,n),只能向上走或向右走,且在任意一点,向右走的次数不能比向上走的少,有多少种路径?
答:从(0,0)出发到达(n,n),需要2n步,其中n次向右,n次向上。但是此处要求向右走的次数不能比向上走的少,也就是说,合法的路径必不可能超过 y = x 这条线,而不合法的走法必然接触y=x+1 这条线。如下图所示,现有一种不正确的走法与 y = x+1 有了交点,那么我们将交点往右的部分沿 y = x+1 对称,则必然经过(n-1,n+1),且一种不合法的走法,对应唯一一条路径。因此,我们从2n步中选取n+1步向上,即是不合法路径。合法路径有种。
题目一:
假设有n对左右括号,请求出合法的排列有多少个?合法是指每一个括号都可以找到与之配对的括号,比如n=1时,()是合法的,但是)(为不合法。
给定一个整数n,请返回所求的合法排列数。保证结果在int范围内。
答:和进出栈问题一模一样,只是把进栈看作左括号,出栈看作右括号。因此同样有种合法排列。
题目二:
2n个人排队买票,n个人拿5块钱,n个人拿10块钱,票价是5块钱1张,每个人买一张票,售票员手里没有零钱,问有多少种排队方法让售票员可以顺利卖票。
给定一个整数n,请返回所求的排队方案个数。保证结果在int范围内。
答:同样的,此处要求排到拿10块钱的人(出栈)时,前面至少有5块钱零钱(入栈),答案同样是。
题目三:
求n个无差别的节点构成的二叉树有多少种不同的结构?
给定一个整数n,请返回不同结构的二叉树的个数。保证结果在int范围内。
答:这一题涉及到卡特兰树的另一个形式:如果一个序列满足
则可以化简为:
所以,n个结点组成树,可以看作以下过程:
因此,有 种结构。
题目四:
12个高矮不同的人,排成两排,每排必须是从矮到高排列,而且第二排比对应的第一排的人高,问排列方式有多少种?
给定一个偶数n,请返回所求的排列方式个数。保证结果在int范围内。
答:首先我们假定已经将这n个人按从矮到高的顺序排好了序,这样就保证了至少每一排中顺序一定是从矮到高的。然后,对于每一个人,我们可以用1或2对其进行编号,表示它在第一排或第二排。如下面的序列(170-185代表身高):
可以发现,如果要求第一排的人必须比第二排矮,那么每一个前缀和中0的数目不能比1少,否则就会出现下面的问题:
因此它又变回了第一题,答案是
问题五:
有n个信封,包含n封信,现在把信拿出来,再装回去,要求每封信不能装回它原来的信封,问有多少种装法?
答:假设第n封信装入了第i个信封,此时可以分为两种情况
(1)第i封信也装入了第n个信封,此时转化为了剩下的n-2封信装错信封问题;
(2)第i封信没有装入第n个信封,此时可以看作i本属于第n个信封,然后转化为剩下n-1封信装错信封问题。
因此,n封信装错信封,共有f(n) = (n-1)*(f(n-2)*f(n-1))种可能(这里是不用从1开始到n重复计算n次的。因为最终求出的结果是所有信件打乱了放入信封,f(n)其实已经代表了所有的情况)。
如:有{a,b,c}3封信,分别装入{A,B,C}3个信封,假设a错误地装入B中,那么b分为两种情况
(1)b装入A中。此时转化为1封信装错信封问题。由于一封信是可能装错的,因此有f(1) = 0。
(2)b没有装入A中,此时看作b本来就是A中的信,于是转化为了2封信装错信封问题。这种情况下只可能是两封信互相调换位置,所以f(1) = 1。
所以3封信装错信封,共有f(3) = 2*(f(0)+f(1)) = 2 种可能。