28.Catalan数通项推导和应用
C a t a l a n : f n = f 1 × f n − 1 × + . . . + f n − 1 × f 1 Catalan: f_n =f_1\times f_{n-1}\times +...+ f_n-1\times f_1 Catalan:fn=f1×fn−1×+...+fn−1×f1
f
n
=
C
2
(
n
−
1
)
n
−
1
n
n
≥
2
f_n=\frac{C_{2(n-1)}^{n-1}}{n}\qquad n\ge2
fn=nC2(n−1)n−1n≥2
不
妨
设
g
(
x
)
=
h
1
x
+
h
2
x
2
+
h
3
x
3
+
.
.
.
+
h
n
x
n
+
.
.
.
不妨设 g(x)=h_1x+h_2x^2+h_3x^3+...+h_nx^n+...\\
不妨设g(x)=h1x+h2x2+h3x3+...+hnxn+...
将
g
(
x
)
×
g
(
x
)
:
g
(
x
)
2
=
h
1
2
x
2
+
(
h
1
h
2
+
h
2
h
1
)
x
3
+
.
.
.
+
(
h
1
h
n
−
1
+
h
2
h
n
−
2
+
.
.
+
h
n
−
1
h
1
)
x
n
+
.
.
.
=
f
1
x
2
+
f
2
x
2
+
.
.
.
+
f
n
x
n
+
.
.
.
将g(x)\times g(x):g(x)^2=h_1^2x^2+(h_1h_2+h_2h_1)x^3+...\\+(h_1h_{n-1}+h_2h_{n-2}+..+h_{n-1}h_1)x^n+...\\=f_1x^2+f_2x^2+...+f_nx^n+...
将g(x)×g(x):g(x)2=h12x2+(h1h2+h2h1)x3+...+(h1hn−1+h2hn−2+..+hn−1h1)xn+...=f1x2+f2x2+...+fnxn+...
将
h
1
=
h
2
=
1
&
h
n
h_1=h_2=1 \& h_n
h1=h2=1&hn递推公式代入其中:
g
(
x
)
2
=
g
(
x
)
−
h
1
x
=
g
(
x
)
−
x
g(x)^2=g(x)-h_1x=g(x)-x
g(x)2=g(x)−h1x=g(x)−x
解得
g
(
x
)
2
−
g
(
x
)
+
x
=
0
g(x)^2-g(x)+x=0
g(x)2−g(x)+x=0:
g
2
(
x
)
=
1
−
1
−
4
x
2
g_2(x)=\frac{1-\sqrt{1-4x}}{2}
g2(x)=21−1−4x
根据牛顿广义二项式定理展开
广义组合数定义
C
n
m
=
∏
k
=
n
−
m
+
1
n
k
m
!
C_n^m=\frac{\prod \limits_{k=n-m+1}^nk}{m!}
Cnm=m!k=n−m+1∏nk
代入得到
g
(
x
)
=
∑
k
=
1
∞
1
k
C
2
K
−
2
k
−
1
x
k
g(x)=\sum_{k=1}^\infty{\frac{1}{k}C_{2K-2}^{k-1}x^k}
g(x)=k=1∑∞k1C2K−2k−1xk
代入得到
f
n
=
1
n
C
2
n
−
2
n
−
1
n
≥
1
f_n=\frac{1}{n}C_{2n-2}^{n-1}\qquad n\ge1
fn=n1C2n−2n−1n≥1
Catalan数多用于二叉树形状数和出栈序列数
-
二叉树形态数
给定一个整数 n,求以 1 … n 为节点组成的二叉搜索树有多少种?
示例:
输入: 3
输出: 5
解释:
给定 n = 3, 一共有 5 种不同结构的二叉搜索树:1 3 3 2 1
\ / / / \
3 2 1 1 3 2
/ / \
2 1 2 3暴力解 O ( N 2 ) O(N^2) O(N2)
class Solution { public: int numTrees(int n) { if(n==1||n==2) return n; int *f =new int[n+1]; f[1]=1; f[2]=2; int res; for(int i=3;i<=n;i++) { res=0; for(int j=1;j<=i-2;j++) { res+=(f[j]*f[i-1-j]); } f[i]=(2*f[i-1]+res); } return f[n]; } };
Catalan数解法
class Solution { public: int numTrees(int n) { if(n==1||n==2) return n; double c=2;//会产生溢出 for(int i=3;i<=n;i++) { c=(c*2*(2*i-1))/(i+1); // 先乘再除 } return c; } };