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

给你一个整数 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];
        }
相关推荐
Java中文社群3 小时前
重要:Java25正式发布(长期支持版)!
java·后端·面试
沐怡旸4 小时前
【底层机制】std::string 解决的痛点?是什么?怎么实现的?怎么正确用?
c++·面试
NAGNIP5 小时前
大模型框架性能优化策略:延迟、吞吐量与成本权衡
算法
bobz9655 小时前
QoS 中的优先级相关的设计
面试
就是帅我不改5 小时前
揭秘Netty高性能HTTP客户端:NIO编程的艺术与实践
后端·面试·github
美团技术团队5 小时前
LongCat-Flash:如何使用 SGLang 部署美团 Agentic 模型
人工智能·算法
isysc17 小时前
面了一个校招生,竟然说我是老古董
java·后端·面试
uhakadotcom7 小时前
静态代码检测技术入门:Python 的 Tree-sitter 技术详解与示例教程
后端·面试·github
bobz9659 小时前
进程面向资源分配,线程面向 cpu 调度
面试
绝无仅有9 小时前
数据库MySQL 面试之死锁与排查经验总结
后端·面试·github