Catalan数

文章目录

  • Catalan数
    • Leecode96 不同的二叉搜索树
      • 题目描述
      • 解题思路
      • 代码
    • Leecode22 括号生成
      • 题目描述
      • 代码

Catalan数

Catalan数是一种组合数学的计数方法,常用于解决一些计数问题,例如括号匹配问题、二叉树的节点问题等。Catalan数的计算公式如下:

请添加图片描述

C0 = 1,         
C1 = 1,         C2 = 2,          C3 = 5,          C4 = 14,          C5 = 42,
C6 = 132,       C7 = 429,        C8 = 1430,       C9 = 4862,        C10 = 16796,
C11 = 58786,    C12 = 208012,    C13 = 742900,    C14 = 2674440,    C15 = 9694845,
C16 = 35357670, C17 = 129644790, C18 = 477638700, C19 = 1767263190, C20 = 6564120420, ...

Leecode96 不同的二叉搜索树

题目描述

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

Catalan数_第1张图片

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

  • 1 <= n <= 19

解题思路

将n个节点可组成的二叉搜索树记作Cn , C0 = 1, C1 = 1, C2 = 2;

C3的计算方法:

  • 将3作为根节点,则1和2必然在3的左下方,共有C2种组合方式
  • 将1作为根节点,则2和3必然在3的右下方,共有C2种组合方式
  • 将2作为根节点,则1位于2的左下方,有C1种组合方式;3位于2的右下方,有C1种组合方式;共有C1 * C1种组合方式
  • 综上可得C3 = 5

C4的计算方法:

  • 将4作为根节点,共有C3种组合方式
  • 将1作为根节点,共有C3种组合方式
  • 将2作为根节点,共有C2 * C1 种组合方式
  • 将1作为根节点,共有C2 * C1 种组合方式
  • 综上可得C4 = 14

由以上推导可得Cn = (Cn-1 * C0) + (Cn-2 * C1) + … + (C0 * Cn-1)

代码

class Solution {
    public int numTrees(int n) {
        int[] list = new int[n+1];
        list[0] = 1;
        for(int i =1;i<=n;i++){
            for(int j = 0;j<=i-1;j++){
                int k = i-j -1;
                list[i] += list[k] * list[j];
            }
        }
        return list[n];
    }
}

Leecode22 括号生成

题目描述

数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。

示例 1:

输入:n = 3
输出:["((()))","(()())","(())()","()(())","()()()"]

示例 2:

输入:n = 1
输出:["()"]

提示:

  • 1 <= n <= 8

代码

class Solution {
    public List<String> generateParenthesis(int n) {
    List<List<String>> list1 = new ArrayList<>();
        List<String> list2 =  new ArrayList<>();
        list2.add("");
        list1.add(new ArrayList<>(list2));
        list2.clear();
        for(int i = 1 ; i<=n;i++){
            for(int j = 0 ;j<i;j++){
                List<String> l1 = list1.get(j);
                List<String> l2 = list1.get(i-j-1);
                for(String s1 : l1){
                    for(String s2:l2){
                        String s = "(" + s1 + ")" + s2;
                        list2.add(s); 
                    }
                }
            }
            list1.add(new ArrayList<>(list2));
            list2.clear();
        }
        return list1.get(n);
    }
}

你可能感兴趣的:(数据结构与算法(java实现),算法,java,数据结构)