面试热题(不同的二分搜索树)

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

经典的面试题,这部分涉及了组合数学中的卡特兰数,如果对其不清楚的同学可以去看我以前的博客卡特兰数

今天用记忆化搜索以及动态规划进行讲解

  • 记忆化搜索
java 复制代码
    //维护一个记忆化搜素
    int[][] memo;
    public int numTrees(int n) {
     memo=new int[n+1][n+1];
    return  count(1,n);
    }
    public int count(int left,int right){
        //单节点,直接返回1
        if(left>=right){
            return 1;
        }
        if(memo[left][right]!=0){
            return memo[left][right];
        }
        int res=0;
        //遍历区间内的每一个节点,都作为根节点的情况
        for(int mid=left;mid<=right;mid++){
            int l=count(left,mid-1);
            int r=count(mid+1,right);
            res+=l*r;
        }
        memo[left][right]=res;
        return res;
    }
  • 动态规划
java 复制代码
   public int numTrees(int n) {
    //先创建一个存储的数组
     int[] dp=new int[n+1];
     dp[0]=1;
        //节点可能存储的位置
        for (int i =1; i <=n; i++) {
            //左边节点可能存储的个数
            for (int j = 0; j<i; j++) {
                //计算出总种类  dp[j]是左树的节点个数 dp[i-j-1]是右树的节点个数
                dp[i]+=dp[j]*dp[i-j-1];
            }
        }
     return dp[n];
        }
相关推荐
CoovallyAIHub4 分钟前
工业视觉检测:多模态大模型的诱惑
深度学习·算法·计算机视觉
Jayden_Ruan10 分钟前
C++分解质因数
数据结构·c++·算法
bubiyoushang88836 分钟前
MATLAB实现雷达恒虚警检测
数据结构·算法·matlab
wu_asia40 分钟前
编程技巧:如何高效输出特定倍数数列
c语言·数据结构·算法
清 澜1 小时前
c++高频知识点总结 第 1 章:语言基础与预处理
c++·人工智能·面试
AlenTech1 小时前
207. 课程表 - 力扣(LeetCode)
算法·leetcode·职场和发展
练习时长一年2 小时前
LeetCode热题100(杨辉三角)
算法·leetcode·职场和发展
lzllzz232 小时前
bellman_ford算法
算法
栈与堆2 小时前
LeetCode 19 - 删除链表的倒数第N个节点
java·开发语言·数据结构·python·算法·leetcode·链表
sunfove2 小时前
麦克斯韦方程组 (Maxwell‘s Equations) 的完整推导
线性代数·算法·矩阵