一、卡特兰数
卡特兰数又称卡塔兰数,英文名Catalan number,是组合数学中一个常出现在各种计数问题中出现的数列。其前几项为:
1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, ...
k(0) = 1, k(1) = 1时,如果接下来的项满足:
k(n) = k(0) * k(n - 1) + k(1) * k(n - 2) + ... + k(n - 2) * k(1) + k(n - 1) * k(0)
或者
k(n) = c(2n, n) - c(2n, n-1)
或者
k(n) = c(2n, n) / (n + 1)
就说这个表达式,满足卡特兰数,常用的是范式1和2,3几乎不会使用到
二、题目一
假设给你N个0,和N个1,你必须用全部数字拼序列
返回有多少个序列满足:任何前缀串,1的数量都不少于0的数量
package class39;
import java.util.LinkedList;
/**
* 假设给你N个0,和N个1,你必须用全部数字拼序列
*
* 返回有多少个序列满足:任何前缀串,1的数量都不少于0的数量
*
* 题型与成对括号是一样的。 有n个左括号,n个右括号 拼接全部字符()排序列 返回多少个满足的序列
* 潜台词有效序列就是要 任何前缀串 左括号数量要不少于右括号的数量 比如 ())... 这里来到第三个字符 九出现右括号2个>左括号 就是无效的
* 那么有效的排列是多少 根据排列组合 C(2N,N) 就是全部组合数 总共2n个字符,左括号n个 要在2n个的位置找n个 所以就是C 2N ,N
* 那么无效的怎么算: 这里我们有个结论 就是 两个集合的数 分别都各自有一一对应的数 那么两集合就是相等数的
* 我们将一个 无效的排序 在出现前缀串无效的后一个开始 后面的括号都取相反, 比如())(() 一开始是3个左右括号
* 来到第三个 出现无效情况 ()),此时前缀肯you定是右括号个数=左括号个数+1
* 接着后面的括号 (() 都取反 变成 ))( 这里也变成 右括号=左括号+1
* 最终变成 右括号+1 = 左括号-1 大2个 而这种集合 就是一一对应无效排序的 所以算出 2n个中选N+1位置排列组合
* 就是C(2N,N-1) 等价于无效排序组合是这么多
* 那么有效的就是 C(2N,N) - C(2N,N+1) 来自公式一演算
*
*
*
* 这个题型是运用 卡特兰数的公式求解
* k(0) = 1, k(1) = 1时,如果接下来的项满足:
* k(n) = k(0) * k(n - 1) + k(1) * k(n - 2) + ... + k(n - 2) * k(1) + k(n - 1) * k(0)
* 或者
* k(n) = c(2n, n) - c(2n, n-1)
* 或者
* k(n) = c(2n, n) / (n + 1)
* 就说这个表达式,满足卡特兰数,常用的是范式1和2,3几乎不会使用到
*/
public class Ways10 {
//根据公式三直接算出结果
public static long ways2(int n){
//base case 0个 1个的时候 都能满足 有1种
if(n < 0) return 0;
if(n < 2) return 1;
//定义两个辅助变量
long a &