leetcode96--不同的二叉搜索树[java]

news2024/12/23 13:19:58

不同的二叉搜索树

  • leetcode 96 题 不同的二叉搜索树
  • 题目描述
  • 暴力递归
    • 解题思路
    • 代码演示
    • 执行效率
  • 递归 + 缓存
    • 解题思路
    • 代码演示
    • 执行效率
  • 动态规划专题

leetcode 96 题 不同的二叉搜索树

原题链接:
难度—中等
https://leetcode.cn/problems/unique-binary-search-trees/

题目描述

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

示例1:
在这里插入图片描述
输入:n = 3
输出:5

示例2:
输入:n = 1
输出:1

提示:
1 <= n <= 19

暴力递归

解题思路

第一先明白搜索二叉树得性质:
左 < 头 < 右
因此.在递归时,我们选中一个数字做头节点后,
剩下得数字里,只有小于这个数得才可以做左子树
大于这个数字的,可以做右子树.
最后在计算数量时,
要把可能组建左子树的情况,去乘右子树可能的情况
一个排列组合,应该能想明白把
好了.思路已经很清晰了.
开撸:

代码演示

  public int numTrees(int n) {
  		//	== 1 时 无需处理
        if(n == 1){
            return 1;
        }
        return process1(1,n);
    }
/**
* 递归
* L 左边界
* R 右边界
* 左右边界 来确定哪些数字可以用于创建左子树
* 哪些数字可以创建右子树
*/
 public int process1(int L,int R){
 		//base case 越界了
 		//关于为什么越界要返回1 ,这样理解
 		//L 到 R 一直在考察,怎么创建,如果都考察到越界了,
 		//说明前面的情况成立了,所以返回一个1
        if(L > R){
            return 1;
        }
        //记录答案
        int ans = 0;
        for(int i = L ; i <= R;i++){
        	//左树能组成的不同情况有几种
            int left = process1(L,i - 1);
            //右树能组成的不同情况有几种
            int right = process1(i+1,R);
            //排列组合的累加就是所有的情况了.
            ans += left * right;
        }
        return ans;
    }

执行效率

这个暴力的递归,执行起来.在leetcode 上跑不过去,会超出时间限制
但是代码是没问题的,我下面给你验证他是没问题的
代码逻辑不改,我们用递归加缓存 再来一版 ,就能跑过去

递归 + 缓存

解题思路

逻辑和暴力递归是一样的,只是我们加了缓存,
缓存怎么加,就是对递归里的变量进行缓存,
递归中的变量是L 和 R 左右边界,
因此加个二维数组,就可以了,
开撸,上代码

代码演示

  public int numTrees(int n) {
        if(n == 1){
            return 1;
        }
        //初始值都是0
        int[][]ans = new int[n + 1][n + 1];
        return process(1,n,ans);
      
    }

	/**
	* 递归加缓存
	* L 左边界
	* R 右边界
	* 左右边界 来确定哪些数字可以用于创建左子树
	* 哪些数字可以创建右子树
	*/
    public int process(int L,int R,int[][]nums){
        if(L > R){
            return 1;
        }
        //不等于0 时 从缓存中拿
        if(nums[L][R] != 0){
            return nums[L][R];
        }
        //下面逻辑和暴力递归是一样的.
        int ans = 0;
        for(int i = L ; i <= R;i++){
            int left = process(L,i - 1,nums);
            int right = process(i+1,R,nums);
            ans += left * right;
        }
        //答案保存在缓存中
        nums[L][R] = ans;
        return ans;
    }

执行效率

在这里插入图片描述

这个题,可以改动态规划 有兴趣的可以试一下

动态规划专题

斐波那契数列-从暴力递归到动态规划

背包问题–填满背包的最大价格

纸牌博弈问题

零钱兑换,凑零钱问题,从暴力递归到动态规划

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/603586.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

chatgpt赋能python:分解gif:使用Python将动态图片拆分成单帧图片

分解gif&#xff1a;使用Python将动态图片拆分成单帧图片 随着互联网上图片的使用越来越普遍&#xff0c;动态图片也成为了大家经常使用的图片之一。GIF动态图作为一种常见的动态图片格式&#xff0c;有时需要将其拆分成单帧图片&#xff0c;以便于使用或修改其中的某一帧。本…

目标检测笔记(九):详细介绍并实现可视化深度学习中每层特征层的网络训练情况

文章目录 为什么要解析特征层如何可视化特征层可视化结果如何 ❤️ &#x1f9e1; &#x1f49b; &#x1f49a; &#x1f499; &#x1f49c; &#x1f5a4; &#x1f90d; &#x1f90e; &#x1f494; ❣️ &#x1f495; &#x1f49e; &#x1f493; &#x1f497; &#…

SpringCloud(三)

文章目录 Eureka注册中心Eureka的结构和作用搭建eureka-server创建eureka-server服务引入eureka依赖编写启动类编写配置文件启动服务 服务注册1&#xff09;引入依赖2&#xff09;配置文件3&#xff09;启动多个user-service实例 服务发现1&#xff09;引入依赖2&#xff09;配…

chatgpt赋能python:Python冒泡法排序:一种简单且高效的排序方法

Python 冒泡法排序&#xff1a;一种简单且高效的排序方法 在计算机科学中&#xff0c;排序算法是一种将给定数据集合重新排列为按照一定顺序排列的有序序列的方法。而冒泡排序算法是其中最简单、最基础的一种排序算法。 什么是冒泡排序&#xff1f; 冒泡排序&#xff0c;顾名…

代码随想录第49天

1.买卖股票的最佳时机&#xff1a; 贪心 因为股票就买卖一次&#xff0c;那么贪心的想法很自然就是取最左最小值&#xff0c;取最右最大值&#xff0c;那么得到的差值就是最大利润。 C代码如下&#xff1a; class Solution { public:int maxProfit(vector<int>& …

一键部署个人ChatGPT Web网站

一键部署个人ChatGPT Web网站 githubVercel使用自己的域名 本文将向大家介绍如何通过Github和Vercel这两个具,轻松搭建自己的ChatGPT Web网站&#xff0c;并且我们还可以添加密码保护以防止恶意滥用。 github 首先&#xff0c;我们需要拥有一个Github账号和Vercel账&#xff0…

【Set集合】概述和特点

Set集合概述和特点 Set集合概述 Set作为Collection集合的子接口&#xff0c;没有新增的功能&#xff0c;Collection集合可用的功能Set集合也可以用。 Set集合特点 Set集合存储的元素是无序的&#xff0c;而且不允许存储重复的元素&#xff0c;每当有新的元素存入的时候&#x…

操作系统复习3.2.1-虚拟内存

传统存储的问题 一次性&#xff1a;一次性装入作业才能运行 驻留性&#xff1a;不是所有部分都需要长时间存放在内存中 定义和特征 将要用的部分载入内存&#xff0c;不用的部分调出外存&#xff0c;逻辑上扩大内存 虚拟内存的最大容量为计算机的寻址范围决定 实际容量则为内…

【哈希值】概述和特点

哈希值概述和特点 哈希值概述 哈希值是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值 Object类中有一个方法可以获取对象的哈希值&#xff1a; public int hashCode()&#xff1a;返回对象的哈希值 哈希值特点 同一个对象多次调用hashCode()方法返回的哈希值是相…

0x36transferData 数据传输

0x36transferData TransferData服务用于客户端将数据从客户端传输到服务器&#xff08;下载&#xff09;或从服务器传输到客户端&#xff08;上传&#xff09; 。 数据传输方向由前面的RequestDownload或RequestUpload服务定义。 如果客户端发起请求下载&#xff0c;则要下载的…

【01】STM32·HAL库开发-单片机简介 |用处、发展历程、发展趋势、CISC与RISC对比、冯诺依曼和哈佛结构对比

目录 1.单片机是什么&#xff08;了解&#xff09;2.单片机有什么用&#xff08;了解&#xff09;3.单片机发展历程&#xff08;了解&#xff09;4.单片机发展趋势&#xff08;了解&#xff09;5.CISC & RISC&#xff08;了解&#xff09;5.1CISC和RISC举例5.2冯诺依曼结构…

【C++】位图应用 | 布隆过滤器

文章目录 1. 位图应用题目一代码实现setrsettest具体代码 题目二位图优缺点总结 2. 布隆过滤器提出背景概念具体实现hash1 hash2 hash3N取值问题settsettset中在与不在那个准确&#xff1f;使用场景及特点具体代码 1. 位图应用 题目一 给40亿个不重复的无符号整数&#xff0c…

压缩感知重构之凸松弛法

算法的重构是压缩感知中重要的一步&#xff0c;是压缩感知的关键之处。因为重构算法关系着信号能否精确重建&#xff0c;国内外的研究学者致力于压缩感知的信号重建&#xff0c;并且取得了很大的进展&#xff0c;提出了很多的重构算法&#xff0c;每种算法都各有自己的优缺点&a…

Linux-地址空间

文章目录 问题引入操作系统宏观认识操作系统与进程程序地址空间进程地址空间问题解释 问题引入 在Linux操作系统中、vim编译器下&#xff0c;出现了变量同地址但不同值的现象。 下面以解释该现象产生的原因为主线&#xff0c;在过程中学习Linux操作系统的知识。 运行代码展示…

chatgpt赋能python:Python分词处理

Python分词处理 随着网络技术的飞速发展&#xff0c;搜索引擎已成为人们了解信息的主要渠道之一&#xff0c;而搜索引擎的核心是关键词匹配&#xff0c;因此分词技术在搜索引擎优化&#xff08;SEO&#xff09;中起着至关重要的作用。Python作为一种强大的编程语言&#xff0c…

【学习日记2023.6.3】之 工作台显示和报表导出

文章目录 12. 工作台显示和报表导出12.1 工作台12.1.1 需求分析和设计12.1.2 代码开发Controller层Service层接口Service层实现类Mapper层 12.1.3 功能测试12.1.4 提交代码 12.2 Apache POI12.2.1 介绍12.2.2 入门案例12.2.2.1 将数据写入Excel文件12.2.2.2 读取Excel文件中的数…

Linux4.7Nginx优化与防盗链

文章目录 计算机系统5G云计算第六章 LINUX Nginx优化与防盗链一、Nginx服务优化和深入优化1.隐藏版本号2.修改用户与组3.缓存时间4.日志切割5.连接超时6.更改进程数7.配置网页压缩8.配置防盗链9.fpm参数优化 计算机系统 5G云计算 第六章 LINUX Nginx优化与防盗链 一、Nginx服…

操作系统复习4.1.0-文件管理结构

定义 一组有意义的信息的集合 属性 文件名、标识符、类型、位置、大小、创建时间、上次修改时间、文件所有者信息、保护信息 操作系统向上提供的功能 创建文件、删除文件、读文件、写文件、打开文件、关闭文件 这6个都是系统调用 创建文件 创建文件时调用Create系统调用…

django中使用celery

Celery介绍&#xff1a; 核心及优点&#xff1a;1.基于分布式系统架构&#xff08;负载均衡避免单点故障&#xff0c;高可用&#xff09; 2.实现了异步任务的调度&#xff08;快速&#xff09; 只需要通过配置文件的修改就可以实现架构的切换所以灵活 django-celery-beat 用…

Oracle中的循环

目录 一、简单循环 1.1LOOP 循环语法&#xff1a; 1.2LOOP 循环示例 二、for循环 2.1for循环语法&#xff1a; 2.2for循环示例 三、while循环 3.1while循环语法 3.2while循环示例 四、GOTO 循环 4.1GOTO 循环语法 4.2GOTO 循环示例 在 Oracle 数据库中&#xff0c;…