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

给你一个整数 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];
        }
相关推荐
hn小菜鸡12 分钟前
LeetCode 377.组合总和IV
数据结构·算法·leetcode
Deepoch1 小时前
Deepoc 大模型:无人机行业的智能变革引擎
人工智能·科技·算法·ai·动态规划·无人机
天真小巫1 小时前
2025.6.27总结
职场和发展
心平愈三千疾1 小时前
通俗理解JVM细节-面试篇
java·jvm·数据库·面试
漂流瓶jz2 小时前
清除浮动/避开margin折叠:前端CSS中BFC的特点与限制
前端·css·面试
我不吃饼干9 天前
鸽了六年的某大厂面试题:你会手写一个模板引擎吗?
前端·javascript·面试
我不吃饼干9 天前
鸽了六年的某大厂面试题:手写 Vue 模板编译(解析篇)
前端·javascript·面试
heimeiyingwang9 天前
【深度学习加速探秘】Winograd 卷积算法:让计算效率 “飞” 起来
人工智能·深度学习·算法
LyaJpunov9 天前
深入理解 C++ volatile 与 atomic:五大用法解析 + 六大高频考点
c++·面试·volatile·atomic
前端fighter9 天前
为什么需要dependencies 与 devDependencies
前端·javascript·面试