[LeetCode96] 不同的二叉搜索树

解法

package com.wangxiaohu;

public class LeetCode96 {

    /**
     * 题目:96. 不同的二叉搜索树
     * leetcode:https://leetcode-cn.com/problems/unique-binary-search-trees/
     *
     * @param n
     * @return
     */
    int[][] memo;

    public int numTrees(int n) {
        memo = new int[n + 1][n + 1];
        // 计算闭区间 [1, n] 组成的 BST 个数
        return counts(1, n);
    }

    //计算闭区间 [lo, hi] 组成的 BST 个数
    private int counts(int lo, int hi) {
        // base case
        if (lo > hi) {
            return 1;
        }

        //查备忘录
        if (memo[lo][hi] != 0) {
            return memo[lo][hi];
        }

        int res = 0;
        // 穷举所有的根节点
        for (int i = lo; i <= hi; i++) {
            int left = counts(lo, i - 1);
            int right = counts(i + 1, hi);
            // 左右子树的组合数乘积是 BST 的总数
            res += left * right;
        }
        // 将结果存入备忘录
        memo[lo][hi] = res;
        return res;
    }
}

上一篇:快速排序


下一篇:C#中使用泛型对象(List)对xml文件中的重复节点进行的序列化和反序列化