算法力扣刷题记录 八十三【96.不同的二叉搜索树】

news2024/11/15 12:02:45

前言

动态规划第9篇。记录 八十三【96.不同的二叉搜索树】。


一、题目阅读

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

示例 1:
在这里插入图片描述

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1

提示:

1 <= n <= 19

二、尝试实现

2.1分析题目,确定方法

  1. 拿到题目之后,要看用什么方法,而不是根据章节分类直接有个思路去想。
  2. 题目问有多少种二叉搜索树,按照示例想:这是从一个集合中选择元素,那么回溯能不能搜索出来呢?回溯题目都能构造一个树形结构。但是在构造树形结构时,发现没有办法筛掉元素,如下:
    在这里插入图片描述
  3. 所以回溯不可能实现。但是画树形结构中想到:
  • 如果选择1作为根节点,那么剩下的[2,3]肯定在右子树中,那么元素个数是2能构成2种右子树。所以1为根节点的二叉搜索树有2种
    在这里插入图片描述

  • 如果选择2作为根节点,那么剩下的[1]肯定在左子树中,那么元素个数是1能构成1种左子树;剩下的[3]肯定在右子树中,那么元素个数是1能构成1种右子树。所以2为根节点的二叉搜索树有1种
    在这里插入图片描述

  • 如果选择3作为根节点,那么剩下的[1,2]肯定在左子树中,那么元素个数是2能构成2种左子树。所以3为根节点的二叉搜索树有2种
    在这里插入图片描述

  • 最后:求和得出n=3时,有5种二叉搜索树。

  • 这个过程是状态的转移。有递推公式,所以是动态规划题目

2.2动态规划思路

  1. 定义dp数组,确定含义。dp[i]代表当组成一个树(可以是子树)的元素个数是i时,可以有dp[i]种二叉搜索树
  2. 确定递推公式:根据2.1中的图和过程——需要一个变量j,从1开始遍历到 i,有个求和的过程。对于每个j来说:
  • leftnum代表以 j 为根节点,左子树中的元素个数;dp[leftnum]就是左子树的种类。
  • rightnum代表以 j 为根节点,右子树中的元素个数;dp[rightnum]就是右子树的种类。
  • 以 j 为根节点的二叉搜索树:dp[leftnum] * dp[rightnum] 种。
  1. 初始化:dp[0] =1;代表当左/右子树没有元素时,只有1种表示。dp[1] = 1;
  2. 遍历顺序:
  • 第一层遍历:i 从2开始,直到n。代表总的节点数;
  • 第二层遍历:j 从1开始,直到 i注意:是i,不是n。代表以j为根节点的二叉搜索树,求其左右子树有多少种;

2.3 代码实现【动态规划】

class Solution {
public:
    int numTrees(int n) {
        //定义dp数组。含义:当组成一个树节点个数是i,构成的二叉搜索树有dp[i]种
        vector<int> dp(n+1,0);

        //初始化:
        dp[0] = 1;//当左/右子树没有元素时,只有1种表示。
        dp[1] = 1;//当元素个数是1,组成的二叉搜索树有1种

        //遍历顺序
        for(int i = 2;i < dp.size();i++){
            for(int j = 1;j <= i;j++){
                //以j作为根节点的数值,那么左子树的元素个数是
                int leftnum = j-1;
                //以j作为根节点的数值,那么右子树的元素个数是
                int rightnum = i-j;
                dp[i] += dp[leftnum]*dp[rightnum];
            }
        }
        return dp[n];
    }
};

三、参考学习

96.不同的二叉搜索树 参考学习链接

  1. 参考给的思路和实现与二、尝试实现一样。关键就是:2.1中由一个不正确的方法,模糊的感觉到有状态转移,所以尝试动态规划
  2. 分析一下时间复杂度:两层for循环:O(N2);
  3. 空间复杂度:需要创建n+1大小的dp数组,所以O(N);

四、总结

96.不同的二叉搜索树 的重点是2.1分析题目,确定方法注意 j 的遍历到 i 为止

(欢迎指正,转载标明出处)

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

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

相关文章

开箱即用的企业级CICD工具-云效流水线 Flow

开箱即用的企业级CICD工具-云效流水线 Flow 开箱即用的企业级CICD工具-云效流水线 Flow资源领取实操来啦编排流水线新建主机组运行流水线运行结果 关于 云效流水线 Flow 的一些看法操作感受新人建议满意与建议流水线Flow 优势 开箱即用的企业级CICD工具-云效流水线 Flow 看到这…

短视频SDK解决方案,降低行业开发门槛

美摄科技匠心打造了一款集前沿技术与极致体验于一体的短视频SDK解决方案&#xff0c;它不仅重新定义了短视频创作的边界&#xff0c;更以行业标杆级的短视频特效&#xff0c;让每一帧画面都闪耀不凡光芒。 【技术赋能&#xff0c;创意无限】 美摄科技的短视频SDK&#xff0c;…

OceanBase V4.3 列存引擎之场景问题汇总

在OceanBase 4.3版本发布后&#xff08;OceanBase社区版 V4.3 免费下载&#xff09;&#xff0c;其新增的列存引擎&#xff0c;及行列混存一体化的能力&#xff0c;可以支持秒级实时分析&#xff0c;引发了用户、开发者及业界人士的广泛讨论。本文选取了这些讨论中较为典型的一…

Linux系统top命令参数说明

目录 一、top命令概览 二、参数说明 一、top命令概览 二、参数说明 第一行&#xff1a;系统的整体情况概览 top:表示这是个top命令 10:53:55:表示当前系统时间 up 17 days, 19:10:表示系统运行时间 1user:表示当前登录用户人数 load average:表示1分钟/5分钟/15分钟 系统负载…

LangChain 实战案例:老喻干货店的 TextToSql 应用解析

前言 当我们在做项目开发时&#xff0c;数据库设计是项目早期的核心工作之一。我们要考虑业务需要用到的表、关联、索引&#xff0c;并预想出未来核心需求或易产生瓶颈的SQL。当这些事情做完&#xff0c;就可以喝杯咖啡&#xff0c;到前台摸鱼会儿了… 如果你是刚入门数据库学…

出海笔记精华问答 | 第四期

更新出海问答第四期&#xff0c;希望可以继续帮助大家解决问题哈。 Q1:当stripe把资金全退给客户但是货又发了&#xff0c;这是什么情况&#xff1f; A1: 这种情况一般是stripe不跟你合作了或者发生了争议。 Q2:如何知道stripe回复你的邮件是人工回复还是机器人回复&#xff…

Matlab自学笔记三十三:表table类型数据的创建、索引和自身属性的用法

1.表类型的概念 表&#xff08;table&#xff09;具有容器特性的数据类型&#xff0c;可以方便的存储混合类型的数据&#xff0c;可以使用数字或命名索引访问数据以及元数据&#xff08;例如变量名称&#xff0c;行名称&#xff0c;描述和变量单位等&#xff09;&#xff1b; …

Java版自动化测试之Selenium

1. 准备 编程语言&#xff1a;Java JDK版本&#xff1a;17 Maven版本&#xff1a;3.6.1 2. 开始 声明&#xff1a;本次只测试Java的Selenium自动化功能 本次示例过程&#xff1a;打开谷歌游览器&#xff0c;进入目标网址&#xff0c;找到网页的输入框元素&#xff0c;输入指…

基于Java+SpringBoot+Vue的网上租赁系统设计与实现

基于JavaSpringBootVue的网上租赁系统设计与实现 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1…

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测

2024硅谷微软和OPENAI的CTO对人工智能发展的最新预测 微软首席技术官凯文斯科特 在红杉资本&#xff08;Sequoia Capital&#xff09;发布的《Training Data》播客中&#xff0c;微软首席技术官凯文斯科特&#xff08;Kevin Scott&#xff09;坚定地重申了他对大语言模型&…

从文字到多媒体:GPT如何彻底革新内容创作

近年来&#xff0c;OpenAI开发的GPT&#xff08;生成预训练变换器&#xff09;模型在自然语言处理领域引起了广泛关注&#xff0c;尤其是GPT-3的推出&#xff0c;更是掀起了一场技术革新浪潮。然而&#xff0c;GPT模型不仅限于自然语言处理&#xff0c;其多模态应用前景同样令人…

AI大模型领域入门:AI产品经理必备知识指南

随着大模型技术的快速发展&#xff0c;市面上涌现出了大量的大模型产品岗位&#xff0c;那么想要进入AI行业的产品经理同学&#xff0c;需要提前做好哪些准备工作呢&#xff1f;这篇文章里&#xff0c;作者总结了入行AI的必备知识&#xff0c;包括市场调研、产品底层逻辑等内容…

打工人必备工具箱

下载地址&#xff1a;https://pan.quark.cn/s/356d7f201d7a 图片工具 图片格式转换图片转ICO图片压缩图片批量转换图片编辑图片分割 视频工具 视频格式转换视频翻转视频提取音频视频倒放视频静音视频分辨率转换视频旋转视频拼接视频调整音量视频取帧 文档工具 PDF合并PDF提…

Kubernetes--命令行工具 kubectl

前言&#xff1a;本博客仅作记录学习使用&#xff0c;部分图片出自网络&#xff0c;如有侵犯您的权益&#xff0c;请联系删除 一、在任意节点使用 kubectl 1、将 master 节点中 /etc/kubernetes/admin.conf 拷贝到需要运行的服务器的 /etc/kubernetes 目录中 [rootk8s-master…

系列:水果甜度个人手持设备检测-前沿方案、论文和思路(一)

系列:水果甜度个人手持设备检测 -- 前沿方案、论文和思路&#xff08;一&#xff09; 背景 我们检索最新前沿领域的论文和思路&#xff0c;一般都不会去GitHub、专利官网这种地方&#xff0c;大家都是正常的人类&#xff0c;我们通常会想到中国知网CNKI、中国国家数字图书馆…

【刷题笔记】二叉树3

之前已经介绍过了二叉树的前中后序遍历及层序遍历&#xff0c;这是解决所有二叉树问题的手段。上一期也提到过&#xff0c;很多题既可以用前中后序遍历去做也可以用层序遍历去做。本期就介绍一下例题&#xff0c;分别展示两种做法。 1. 二叉树的右视图 199. 二叉树的右视图 给…

使用 preloadComponents 进行组件预加载

title: 使用 preloadComponents 进行组件预加载 date: 2024/8/18 updated: 2024/8/18 author: cmdragon excerpt: 摘要&#xff1a;本文介绍Nuxt 3中的preloadComponents功能&#xff0c;用于预加载全局注册的组件以减少首次渲染阻塞时间&#xff0c;通过实例演示如何设置并…

EmguCV学习笔记 C# 4.2 二值化

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请在显著位置标明本文出处以及作者网名&#xff0c;未经作者允许不得用于商业目的。 教程VB.net版本请访问&#xff1a;EmguCV学习笔记 VB.Net 目录-CSDN博客 教程C#版本请访问&#xff1a;EmguCV学习笔记 C# 目录-CSD…

WebRTC音视频开发读书笔记(五)

WebRTC既可以收发音频和视频&#xff0c;还可以传输其它数据&#xff0c;如短消息、二进制数据、文本数据等。可以实现文本聊天、文件传输等场景。 八、数据通道 1、基本概念 WebRTC的数据通道好比高速公路、文本、文件、图像以及其它数据 好比货物&#xff0c;通道打通 &am…

SpringBoot Web请求、响应

一、文章概述 请求方面主要讲&#xff0c;当前端向后端发出请求时&#xff0c;对于不同类型的参数后端都如何接收&#xff1b;对于响应&#xff0c;文章会讲解后端如何向前端响应数据以及如何使返回的数据具有统一的格式。 二、请求 2.1接收简单参数 Controller方法&#xf…