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

leecode654——最大二叉树

leecode最大二叉树

🌻题目要求:

给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建:
创建一个根节点,其值为 nums 中的最大值。
递归地在最大值 左边 的 子数组前缀上 构建左子树。
递归地在最大值 右边 的 子数组后缀上 构建右子树。
返回 nums 构建的 最大二叉树 。

🌻思路一:递归

🌻思路二: 单调栈

使用递归虽然每次对数组进行了拆分,但是会对数组中的元素也进行多次遍历,那么会不会有一种方式,可以仅通过一次遍历就可以得出最终结果。
单调栈的思路:

🔵(1)如果栈顶元素大于待插入的元素,那么直接入栈;
🔵(2)如果栈顶元素小于待插入的元素,那么栈顶元素出栈

在对比节点的同时,也要进行二叉树得到构造,即:

🔵(1)如果栈顶元素大于待插入的元素,则栈顶元素.right=待插入元素
🔵(2) 如果栈顶元素小于待插入的元素,则待插入元素.left=栈顶元素。

图来自:leecode大佬思路

🌻 以nums=[3,2,1,6,0,5]为例,看单调栈如何创建二叉树。

🌿首先,对于数组前3个元素,满足Node(3)>Node(2)>Node(1),所以3个元素直接入栈,并且构造二叉树Node(3).right=Node(2),Node(2).right=Node(1)

在这里插入图片描述

🌿当遍历到Node(6)时,由于Node(1)<Node(6),所以Node(1)出栈,并且执行Node(6).left=Node(1),又由于Node(2)<Node(6),所以Node(2)也出栈,并且执行Node(6).left=Node(2),
🔔注意:此时Node(6)的左节点从Node(1)变成了Node(2),由于Node(3)<Node(6),所以Node(6).left=Node(3),注意:此时Node(6)的左节点从Node(2)变成了Node(3),由于栈中没有元素可以出栈 了,没有可以和Node(6)对比的元素了,因此Node(6)入栈。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

🌿我们继续遍历到Node(0),由于Node(0)小于栈顶元素Node(6),所以Node(0)直接入栈就可以了。但是,别忘记维护一下二叉树,也就是说,配置一下Node(6).right = Node(0)。具体操作,如下图所示:

在这里插入图片描述

🌿最后,我们遍历到了Node(5),由于Node(5)大于当前栈顶元素Node(0),所以Node(0)执行出栈操作,并维护二叉树结构Node(5).left = Node(0);在对比Node(5)小于当前栈顶元素Node(6),所以,Node(5)直接入栈即可。维护二叉树结构Node(6).right = Node(5)。具体操作,如下图所示:

在这里插入图片描述
在这里插入图片描述

🌻代码如下:

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {Deque<TreeNode> q=new ArrayDeque<>();for(int i=0;i<nums.length;i++){TreeNode node=new TreeNode(nums[i]);while(!q.isEmpty()){TreeNode topNode=q.peekLast();if(topNode.val>node.val){q.addLast(node);topNode.right=node;break;}else{q.removeLast();node.left=topNode;}}if(q.isEmpty()){q.addLast(node);}}return q.peek();}
}

🌻补充:

1.单调栈

🟢单调栈是一种特殊的栈数据结构,它的特点是栈内的元素保持单调递增或单调递减的顺序。具体来说,单调栈可以分为单调递增栈和单调递减栈两种类型。

在使用单调栈时,通常需要解决与元素的大小关系相关的问题,例如找到数组中元素的下一个更大元素、下一个更小元素等。单调栈提供了一种高效的方法来解决这些问题。

🟢单调递增栈的特点是栈内的元素从栈底到栈顶保持递增的顺序,而单调递减栈则是栈内的元素从栈底到栈顶保持递减的顺序。
🟢使用单调栈的好处包括:

快速找到某个元素的下一个更大或更小元素。通过保持栈内元素的单调性,可以在 O(1) 的时间复杂度内找到下一个更大或更小的元素,而无需遍历整个数组或其他数据结构。
节省空间和时间复杂度。相比其他数据结构,单调栈通常可以以更少的空间和更低的时间复杂度来解决一些特定的问题。解决一些特定的问题。单调栈常用于解决与元素大小相关的问题,如找到数组中元素的下一个更大元素、下一个更小元素,或者计算数组中每个元素的距离最近的更大或更小元素等。

2.单调栈和普通栈的区别

🟢 单调性要求:

单调栈要求栈内的元素保持单调递增或单调递减的顺序,而普通栈没有这个要求,可以存储任意顺序的元素。

🟢入栈规则:

单调栈的入栈规则与普通栈相同,即将元素压入栈顶。但是,单调栈在入栈时需要根据单调性进行调整。对于单调递增栈,当有新的元素要入栈时,需要将栈内比该元素小的元素全部出栈;对于单调递减栈,则是将栈内比该元素大的元素全部出栈。

🟢出栈规则:

单调栈的出栈规则与普通栈相同,即将栈顶元素弹出。在单调栈中,出栈操作通常与寻找下一个更大或更小元素有关,具体出栈规则会根据问题的需求而定。

🟢使用场景:

普通栈可以用于存储和操作任意类型的数据,适用于一般的栈操作。而单调栈主要应用于一些特定问题,例如找到数组中元素的下一个更大或更小元素、计算数组中每个元素的距离最近的更大或更小元素等,这些问题与元素的大小关系有关,而单调栈提供了一种高效的解决方法。

相关文章:

leecode654——最大二叉树

leecode最大二叉树 &#x1f33b;题目要求&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。 递归地在最大值 左边 的 子数组前缀上 构建左子树。 递归地在最大值 右边 的…...

【笔试强训选择题】Day12.习题(错题)解析

作者简介&#xff1a;大家好&#xff0c;我是未央&#xff1b; 博客首页&#xff1a;未央.303 系列专栏&#xff1a;笔试强训选择题 每日一句&#xff1a;人的一生&#xff0c;可以有所作为的时机只有一次&#xff0c;那就是现在&#xff01;&#xff01;&#xff01; 文章目录…...

边缘计算与开放源代码的完美结合

随着人工智能、大数据和物联网等技术的快速发展&#xff0c;边缘计算已经成为一种普遍使用的计算方式&#xff0c;尤其是在物联网领域。与此同时&#xff0c;越来越多的开放源代码项目也在不断涌现&#xff0c;这些项目为边缘计算提供了更多的选择和灵活性。那么&#xff0c;边…...

边缘计算网关在储能系统中的应用——提高储能系统的安全性和稳定性

随着全球能源消耗和环境保护意识的不断提高&#xff0c;储能技术逐渐成为了各国电力系统中的重要一环。而作为储能技术中的关键设备之一&#xff0c;边缘计算网关在储能系统中的应用也越来越受到关注。本文将从边缘计算网关的定义、特点以及其在储能行业中的应用三个方面来介绍…...

【FMC136】AD9467之4通道 250MSPS 采样率16位AD 采集子卡模块得设计原理图中文资料

板卡概述 FMC136 是一款4 通道250MHz 采样率16 位AD 采集FMC子卡&#xff0c;符合VITA57 规范&#xff0c;可以作为一个理想的IO 模块耦合至FPGA前端&#xff0c;4 通道AD 通过高带宽的FMC 连接器&#xff08;HPC&#xff09;连接至FPGA 从 而大大降低了系统信号延迟。该板卡支…...

抖音SEO矩阵系统源码开发(一)

抖音seo矩阵营销系统/抖音SEO矩阵号管理系统/抖音霸屏源码开发搭建&#xff0c;抖音官方团队大力推广抖音SEO生态&#xff0c;我们应如何布局开发抖音SEO矩阵系统&#xff0c;来达到账号排名优化的效果&#xff0c;很显然&#xff0c;账号关键词起到了很关键的作用。首先&#…...

Mysql实现对某一字段排序并将排名写入另一字段

文章目录 前言一、数据库表结构和样例数据二、排名操作1.普通排名2.无间隔排名3.有间隔排名 总结 前言 最近业务上碰到这样一个需求&#xff0c;需要对表按照某一个字段进行排序&#xff0c;并且将得到的排名写入对应的排名字段。这个需求于我而言确实没有遇到过&#xff0c;好…...

vector容器 [上]

目录 一、 对于vector的介绍 二、vector的定义 0x01 无参构造 0x02 构造并初始化n个val 0x03 使用迭代器进行初始化构造 0x04 拷贝构造 0x05 比较 三、 vector的遍历 0x01 push_back() 0x02 operator[] 和at() 0x03 遍历 四、vector 容量空间 0x01 max_size : 返回v…...

React Native技术探究:开发高质量的跨平台移动应用的秘诀

作为一个跨平台移动应用开发框架&#xff0c;React Native在开发过程中能够有效提高开发效率、降低开发成本、缩短上线时间&#xff0c;因此备受开发者的欢迎。然而&#xff0c;如何使用React Native开发出高质量的跨平台移动应用呢&#xff1f;本文将探究这个问题&#xff0c;…...

C语言函数大全-- w 开头的函数(2)

C语言函数大全 本篇介绍C语言函数大全-- w 开头的函数 1. wcstok 1.1 函数说明 函数声明函数功能wchar_t *wcstok(wchar_t *wcs, const wchar_t *delim, wchar_t **ptr);用于将一个长字符串拆分成几个短字符串&#xff08;标记&#xff09;&#xff0c;并返回第一个标记的地…...

kafka启动创建topic报错:zookeeper is not a recognized option

当前使用版本&#xff1a;kafka_2.13-3.4.0 使用老版本的创建topic的命令&#xff0c;是用zookeeper来创建&#xff0c;但是报错如下 D:\Software\Doument\kafka_2.13-3.4.0> .\bin\windows\kafka-topics.bat --create --zookeeper localhost:2181 --replication-factor 1 …...

11个超好用的SVG编辑工具

SVG的优势在于SVG图像可以更加灵活&#xff0c;自由收缩放大而不影响图片的质量&#xff0c;一个合适的SVG编辑工具能够让你的设计事半功倍&#xff0c;下面就一起来看看这些冷门软件好用在哪里。这11个超好用的SVG编辑工具依次为&#xff1a;即时设计、Justinmind、Sketsa SVG…...

低代码平台:10分钟从入门到原理

导航目录 一、低代码概念 二、优势及局限 三、基础功能及搭建 1、业务流程 2、用户权限 3、统计图表 四、使用感受 五、总结 传统的软件研发方式目前并不能很好地满足企业的需求&#xff1a;人员成本高、研发时间长、运维复杂。这时低代码工具的出现为快速开发软件提供…...

【JavaScript】如何获取客户端IP地址?

使用这个库&#xff1a;request-ip 它按照如下顺序获取请求的IP地址&#xff1a; X-Client-IPX-Forwarded-For (Header may return multiple IP addresses in the format: “client IP, proxy 1 IP, proxy 2 IP”, so we take the first one.)CF-Connecting-IP (Cloudflare)F…...

数据科学中使用的17 种相似性和相异性度量之欧氏距离

目录 1简介 2距离函数 2.1 L2范数&#xff08;欧氏距离&#xff09; 1简介 在数据科学中&#xff0c;相似性度量是一种衡量数据样本如何相互关联或相互接近的方法。另一方面&#xff0c;相异性度量是告诉数据对象有多少是不同的。此外&#xff0c;当相似的数据样本被分组到一…...

朋友去华为面试,轻松拿到30K的Offer,羡慕了......

最近有朋友去华为面试&#xff0c;面试前后进行了20天左右&#xff0c;包含4轮电话面试、1轮笔试、1轮主管视频面试、1轮hr视频面试。 据他所说&#xff0c;80%的人都会栽在第一轮面试&#xff0c;要不是他面试前做足准备&#xff0c;估计都坚持不完后面几轮面试。 其实&…...

MySQL入门第五课:数据更新

数据更新 1 插入 插入表数据 insert into 表名 (字段列表) values(值列表) insert into 表名 set 字段名1 值1,字段名2值2 插入多个数据 insert into 表名 values(值1&#xff0c;值2&#xff0c;值3.....&#xff09; 这里面的值与列索引是对应的 显示表数据 select * fr…...

ALSA子系统(十八)------指纹解锁动画提示声卡顿问题解析

你好&#xff01;这里是风筝的博客&#xff0c; 欢迎和我一起交流。 很久没写kernel相关的东西了&#xff0c;主要是来到手机厂之后&#xff0c;大部分还是在Android上&#xff0c;Kernel虽然也有涉及&#xff0c;但毕竟只是有所涉及&#xff0c;主要业务逻辑还是在HAL之上&am…...

[230513] TPO72 | 2022年托福阅读真题第1/36篇 | 10:45

Invading Algae 目录 Invading Algae 全文 题目 Paragraph 1 P1 段落大意 问题1 Paragraph 2 P2 段落大意 问题2 *问题3* Paragraph 3 P3 段落大意 问题4 Paragraph 4 P4 段落大意 Paragraph 5 P5 段落大意 *问题5* *问题6* 问题7 问题8 问题9…...

操作符详解

目录 操作符分类 算术操作符 - * / % 二进制 二进制总结 移位操作符&#xff08;操作数只能为整数&#xff09; << >> 位操作符&#xff08;操作数必须为整数&#xff09; & | ^ 面试题 赋值操作符 复合赋值符 单目操作符 单目操作符介绍…...

【力扣数据库知识手册笔记】索引

索引 索引的优缺点 优点1. 通过创建唯一性索引&#xff0c;可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度&#xff08;创建索引的主要原因&#xff09;。3. 可以加速表和表之间的连接&#xff0c;实现数据的参考完整性。4. 可以在查询过程中&#xff0c;…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡&#xff08;如 HAProxy、AWS NLB、阿里 SLB&#xff09;发起上游连接时&#xff0c;将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后&#xff0c;ngx_stream_realip_module 从中提取原始信息…...

spring:实例工厂方法获取bean

spring处理使用静态工厂方法获取bean实例&#xff0c;也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下&#xff1a; 定义实例工厂类&#xff08;Java代码&#xff09;&#xff0c;定义实例工厂&#xff08;xml&#xff09;&#xff0c;定义调用实例工厂&#xff…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

Mac软件卸载指南,简单易懂!

刚和Adobe分手&#xff0c;它却总在Library里给你写"回忆录"&#xff1f;卸载的Final Cut Pro像电子幽灵般阴魂不散&#xff1f;总是会有残留文件&#xff0c;别慌&#xff01;这份Mac软件卸载指南&#xff0c;将用最硬核的方式教你"数字分手术"&#xff0…...

什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南

文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果![在这里插入图片描述](https://i-blog.csdnimg.cn/direct/55aefaea8a9f477e86d065227851fe3d.pn…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

网站指纹识别

网站指纹识别 网站的最基本组成&#xff1a;服务器&#xff08;操作系统&#xff09;、中间件&#xff08;web容器&#xff09;、脚本语言、数据厍 为什么要了解这些&#xff1f;举个例子&#xff1a;发现了一个文件读取漏洞&#xff0c;我们需要读/etc/passwd&#xff0c;如…...

排序算法总结(C++)

目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指&#xff1a;同样大小的样本 **&#xff08;同样大小的数据&#xff09;**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...