当前位置: 首页 > news >正文

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

前言

动态规划第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 为止

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 鼠标手势软件,效率办公必备!移动鼠标即可执行命令
  • 个人效能是一个系统
  • Redis 缓存预热、雪崩、穿透、击穿
  • 坐牢第二十七天(聊天室)
  • [游戏开发] LuaTable转string存读二进制文件
  • vue 后台管理 之 axios使用及接口拦截响应等
  • 基于神经网络逆同步控制方法的两变频调速电机控制系统matlab仿真
  • Linux git安装与部署
  • 服务器数据恢复—IBM服务器raid5阵列硬盘出现坏道的数据恢复案例
  • 服务器上部署服务
  • Revite二次开发_使用WPF和WebView2制作一个访问网站的窗口
  • pygame游戏开发系列教程(1)
  • C++数组入门
  • Python知识点:如何使用Boto3进行AWS服务管理
  • Electron 集成 Express + p-limit + SQlite WAL读写模式解决并发锁库的问题
  • JavaScript-如何实现克隆(clone)函数
  • bootstrap创建登录注册页面
  • ES6--对象的扩展
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • JS字符串转数字方法总结
  • PAT A1050
  • Python语法速览与机器学习开发环境搭建
  • rc-form之最单纯情况
  • React中的“虫洞”——Context
  • SwizzleMethod 黑魔法
  • 大数据与云计算学习:数据分析(二)
  • 关于extract.autodesk.io的一些说明
  • 技术胖1-4季视频复习— (看视频笔记)
  • 看完九篇字体系列的文章,你还觉得我是在说字体?
  • 前端之Sass/Scss实战笔记
  • 融云开发漫谈:你是否了解Go语言并发编程的第一要义?
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 怎么把视频里的音乐提取出来
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​​​​​​​开发面试“八股文”:助力还是阻力?
  • #pragma once与条件编译
  • #QT项目实战(天气预报)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (Charles)如何抓取手机http的报文
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (PHP)设置修改 Apache 文件根目录 (Document Root)(转帖)
  • (附源码)springboot 房产中介系统 毕业设计 312341
  • (附源码)计算机毕业设计ssm基于Internet快递柜管理系统
  • (附源码)计算机毕业设计SSM疫情下的学生出入管理系统
  • (十二)springboot实战——SSE服务推送事件案例实现
  • (五)Python 垃圾回收机制
  • (一)SpringBoot3---尚硅谷总结
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (终章)[图像识别]13.OpenCV案例 自定义训练集分类器物体检测
  • (转)visual stdio 书签功能介绍
  • ./configure,make,make install的作用
  • .apk文件,IIS不支持下载解决