![bee40296bd7a5f8ecb093539f0e1388b.png](https://img-blog.csdnimg.cn/img_convert/bee40296bd7a5f8ecb093539f0e1388b.png)
在算法刷题过程中常常碰到给出
DP
,也可能是组合数学,下面说一下组合数学里面常用的内容:
组合的递推公式:
由于组合数据涉及阶乘(
- 1
- 1,1
- 1,2,1
- 1,3,3,1
- 1,4,6,4,1
- 1,5,10,10,5,1
- 1,6,15,20,15,6,1
- ......
`java`代码如下所示
c = new long[n][n];
c[0][0] = 1;
for (int i = 1; i < n; ++i) {
c[i][0] = 1;
for (int j = 1; j < n; ++j) {
c[i][j] = (c[i - 1][j - 1] + c[i - 1][j]) % MOD;
}
}
杨辉三角形常用的性质有以下几点:
- 每个数等于它上方两数之和。
- 每行数字左右对称,由
1
开始逐渐变大。 - 第
n
行的数字有n
项。 - 前
n
行共[(1+n)n]/2
个数。 - 第
n
行的m
个数可表示为C(n-1,m-1)
,即为从n-1
个不同元素中取m-1
个元素的组合数。(注意:当用数组时,由于从下标0开始,所以不用减一操作) - 第
n
行的第m
个数和第n-m+1
个数相等 ,为组合数性质之一。 - 每个数字等于上一行的左右两个数字之和。可用此性质写出整个杨辉三角。即第n+1行的第i个数等于第n行的第i-1个数和第i个数之和,这也是组合数的性质之一。即`C(n + 1, i) = C(n, i) + C(n, i - 1)`。
(a+b)^n
的展开式中的各项系数依次对应杨辉三角的第(n+1)
行中的每一项。- 将第
2n+1
行第1
个数,跟第2n+2
行第3
个数、第2n+3
行第5
个数……连成一线,这些数的和是第4n+1
个斐波那契数F(n) = F(n - 1) + F(n - 2)
;将第2n
行第2
个数(n>1)
,跟第2n-1
行第4
个数、第2n-2
行第6
个数……这些数之和是第4n-2
个斐波那契数。 - 除了
1
之外,所有正整数都出现有限次,只有2
出现刚好一次,6,20,70
等出现三次;出现两次和四次的数很多,还未能找到出现刚好五次的数。120,210,1540
等出现刚好六次。
例如:[1569. 将子数组重新排序得到同一个二叉查找树的方案数]
给你一个数组 nums 表示 1 到 n 的一个排列。我们按照元素在 nums 中的顺序依次插入一个初始为空的二叉查找树(BST)。请你统计将 nums 重新排序后,统计满足如下条件的方案数:重排后得到的二叉查找树与 nums 原本数字顺序得到的二叉查找树相同。
解题思路:
- 在根节点下,左右子树内的排序不变,但是左右子树穿插排序,重排后得到的二叉树与
nums
原顺序一致,此时用到排列组合。 - 自定义
class
类,构建二叉排序树。每个节点同时存储当前节点值,左节点,右节点指向,当前节点下有多少个子节点。 - 使用深度优先搜索的方式,找出所有节点子树节点的排序方式
- 最终球的结果。