java数据结构与算法刷题-----LeetCode654. 最大二叉树

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

文章目录

    • 1. 法一:单调栈
    • 2. 法二:递归

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

1. 法一:单调栈

注意:单调栈比递归方法难理解的多,单调栈时间复杂度为O(n),递归方法的时间复杂度为O( n 2 n^2 n2). 实际工作场景中,单调栈的效率肯定更高,但是这是做题,因为测试用例的数量较少,反而会比下面递归方法花费的时间更多。所以不要因为提交后发现这个算法效率没有递归的高就放弃掌握此方法。

解题思路:时间复杂度O(n),空间复杂度O(n)
  1. 利用单调栈来处理
  2. 每一个结点都要入栈,但是入栈前:
  1. 如果栈中已经入栈的,都比它小,说明他就是一个中间结点,那么栈中的元素应该是他的左区间,应该成为它的左子树
  2. 如果栈中已经入栈的,比当前要入栈的结点node大,说明,node应该成为人家栈顶元素的右子树。
  1. 最终返回栈低那个最大的元素,就是构造完成的二叉树的根节点

图解如下:

  1. 第一个元素可以无脑入栈
    在这里插入图片描述
  2. 第二个元素,2,入栈时发现栈顶元素3比它大,说明2应该是栈顶右子树,然后栈顶元素指向2
    在这里插入图片描述
  3. 第三个元素,1,入栈时发现栈顶元素2,比它大,说明1应该是栈顶元素右子树,然后栈顶元素指向1.
    在这里插入图片描述
  4. 第4个元素,6
  1. 入栈时发现栈顶为1,比它小,则出栈1,成为其左子树
    在这里插入图片描述
  2. 然后发现新的栈顶2依然比它小,继续出栈成为其左子树
    在这里插入图片描述
  3. 然后发现栈顶3依然比它小,继续出栈成为其左子树,然后栈空了,将6入栈,此时栈中只有一个6结点
    在这里插入图片描述
  1. 第5个元素,0,入栈时发现比栈顶6小,成为其右子树然后入栈
    在这里插入图片描述
  2. 第6个元素,5
  1. 入栈时发现比栈顶0大,则0出栈成为其左子树
    在这里插入图片描述
  2. 然后发现,栈顶的6比它大,它就得成为6的右子树,然后入栈
    在这里插入图片描述

此时,完成了遍历,二叉树也构造完成,栈中的元素为[6,5],其中5是栈顶。而栈低必然是根节点6.所以最后我们得返回栈低的6

代码

在这里插入图片描述

class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {if(nums.length == 0) return null;if(nums.length == 1) return new TreeNode(nums[0]);int n = nums.length;//单调栈,结点入栈前,如果栈中元素比它小,栈中元素成为其左子树,如果栈中元素比它大,它成为栈顶元素右子树TreeNode[] stack = new TreeNode[n];int index = -1;//栈顶指针,初始-1for (int i = 0; i < n; ++i) {//依次遍历结点TreeNode node = new TreeNode(nums[i]);//将数字变为TreeNode结点while (index > -1 && nums[i] > stack[index].val) {//如果栈中结点,比它小,成为其左子树node.left = stack[index--];//出栈成为其左子树}if (index>-1) {//如果栈中元素比它大,或者等于它stack[index].right = node;//它必须成为其右子树}stack[++index] = node;//最后将此结点也入栈,以便下一个结点处理与它的关系}return stack[0];//最终"栈低"一定会留有一个根节点。}
}

2. 法二:递归

解题思路:时间复杂度O( n 2 n^2 n2),空间复杂度O(n)
  1. 划分区间,每次找区间最大值,然后再次以它为中心,划分两个区间
  2. 初始区间是整个数组,找到最大值后,以它为中心划分两个区间再次递归
  3. 左边区间是它的左节点,右边区间是它的右节点
代码

在这里插入图片描述

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode() {}*     TreeNode(int val) { this.val = val; }*     TreeNode(int val, TreeNode left, TreeNode right) {*         this.val = val;*         this.left = left;*         this.right = right;*     }* }*/
class Solution {public TreeNode constructMaximumBinaryTree(int[] nums) {return constructMaximumBinaryTree(nums,0,nums.length-1);}public TreeNode constructMaximumBinaryTree(int[] nums,int left,int right) {if(right < left) return null;if(right == left ) return new TreeNode(nums[left]);//right和left指向同一个结点直接返回//找到区间[left,right]的最大值作为中间结点int maxIndex = left;for(int i = left+1;i<=right;i++)if(nums[i]>nums[maxIndex]) maxIndex = i;//构建中间结点TreeNode node = new TreeNode(nums[maxIndex]);//左区间构建左子树,右区间构建右子树node.left = constructMaximumBinaryTree(nums,left,maxIndex-1);node.right = constructMaximumBinaryTree(nums,maxIndex+1,right);return node;}
}

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

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

相关文章

读人工不智能:计算机如何误解世界笔记02_Hello,world

1. Hello&#xff0c;world 1.1. “Hello&#xff0c;world”是布赖恩克尼汉和丹尼斯里奇于1978年出版的经典著作《C程序设计语言》中的第一个编程项目 1.2. 贝尔实验室可以说是现代计算机科学界中的智库&#xff0c;地位好比巧克力界的好时巧克力 1.3. 计算机科学界的大量创…

vue从flask获取数据并显示

记录一个前后端分离遇到的问题&#xff0c;即vue前端从flask后端获取数据。具体描述如下&#xff1a;flask只负责连接数据库并获取数据库的数据&#xff0c;并返回给前端vue&#xff1b;vue则需要获取后端返回的数据并显示。 方法如下&#xff0c;分别用一个vue组件和一个flas…

C++——基础语法(3):内联函数、auto关键字、基于范围的for循环、空指针nullptr

6. 内联函数 在函数前加入inline修饰即可将函数变为内联函数。所谓内联函数&#xff0c;就是在编译时C编译器会将函数体在调用内联函数的地方展开&#xff0c;从而省去了调用函数的栈帧开销&#xff0c;提高程序运行效率。 inline int Add(int a, int b) {return a b; } int …

Ansible user 模块 该模块主要是用来管理用户账号

目录 参数语法验证创建用户删除用户验证 删除用户 参数 comment  # 用户的描述信息 createhome  # 是否创建家目录 force  # 在使用stateabsent时, 行为与userdel –force一致. group  # 指定基本组 groups  # 指定附加组&#xff0c;如果指定为(groups)表示删除所有…

Camunda7.18流程引擎启动出现Table ‘camunda_platform_docker.ACT_GE_PROPERTY‘的解决方案

文章目录 1、问题描述2、原因分析3、解决方案3.1、方案一&#xff1a;降低mysql版本3.2、方案二&#xff1a;增加nullCatalogMeansCurrent参数&#xff08;推荐&#xff09; 4、总结 1、问题描述 需要在docker中&#xff0c;部署Camunda流程引擎。通过启动脚本camunda-platfor…

【C++】类和对象之拷贝构造函数篇

个人主页 &#xff1a; zxctscl 文章封面来自&#xff1a;艺术家–贤海林 如有转载请先通知 文章目录 1. 前言2. 传值传参和传引用传参3. 概念4. 特征 1. 前言 在前面学习了6个默认成员函数中的构造函数和析构函数 【C】构造函数和析构函数详解&#xff0c;接下来继续往后看拷…

Github 2024-02-21 开源项目日报 Top10

根据Github Trendings的统计&#xff0c;今日(2024-02-21统计)共有10个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目8非开发语言项目1TypeScript项目1 gpt4free 语言模型集合改进计划 创建周期&#xff1a;300 天开…

<网络安全>《51 网络攻防专业课<第十四课 - 华为防火墙的使用(4)>

8 防火墙的防范技术&#xff08;3&#xff09; 8.1 IP spoofing攻击防范 攻击介绍 为了获得访问权&#xff0c;或隐藏入侵者的身份信息&#xff0c;入侵者生成带有伪造源地址的报文。 处理方法 检测每个接口流入的IP报文的源地址与目的地址&#xff0c;并对报文的源地址反查路…

【图论】【堆优化的单源路径】LCP 20. 快速公交

作者推荐 【广度优先搜索】【网格】【割点】【 推荐】1263. 推箱子 LCP 20. 快速公交 小扣打算去秋日市集&#xff0c;由于游客较多&#xff0c;小扣的移动速度受到了人流影响&#xff1a; 小扣从 x 号站点移动至 x 1 号站点需要花费的时间为 inc&#xff1b; 小扣从 x 号站…

计算机组成原理(14)----总线

目录 一.总线的物理实现 二.总线概述 三.总线的特性 四.总线的分类 &#xff08;1&#xff09;按数据传输格式分类 •串行总线 •并行总线 &#xff08;2&#xff09;按总线功能分类 •片内总线 •系统总线 系统总线的结构 •通信总线 &#xff08;3&#xff09;按…

从软硬件以及常见框架思考高并发设计

目录 文章简介 扩展方式 横向扩展 纵向扩展 站在软件的层面上看 站在硬件的层面上看 站在经典的单机服务框架上看 性能提升的思考方向 可用性提升的思考方向 扩展性提升的思考方向 文章简介 先从整体&#xff0c;体系认识&#xff0c;理解高并发的策略&#xff0c;方…

深入理解JS的执行上下文、词法作用域和闭包(上)

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

ARM Cortex-X5 传言表现不佳,高功率浪涌和低多核分数影响即将推出的核心设计

ARM 的新 Cortex-X5 设计似乎遇到了问题&#xff0c;有新的传言称&#xff0c;超级核心在提高时钟速度时会经历严重的高功耗&#xff0c;并且当最大功率限制降低时&#xff0c;多核性能会下降。虽然这对高通来说可能不是问题&#xff0c;因为据说其 Snapdragon 8 Gen 4 采用定制…

华为HCIP Datacom H12-831 卷24

多选题 1、如图所示&#xff0c;某园区部署OSPF实现网络互通&#xff0c;其中Area1部署为NSSA区域。某工程师为了实现R1访问R4的环回口地址&#xff0c;在R4的OSPF进程中引入直连路由。以下关于该场景的描述,错误的有哪些项? A、在R4引入直连路由后&#xff0c;R1通过转换后的…

服务区智慧公厕

在如今追求智能化、便捷化的社会背景下&#xff0c;高速公路服务区智慧公厕正成为人们关注的焦点。作为高速公路上的必要设施&#xff0c;公厕的提升已经不再局限于简单的清洁卫生&#xff0c;而是更多地涉及到智能化、舒适度和用户体验。本文以智慧公厕源头厂家广州中期科技有…

华为---RSTP(三)---P/A机制及RSTP的生成树形成过程

目录 1. P/A机制简介 1.1 P/A机制的作用 1.2 P/A协商的前提条件 1.3 RSTP选举思路 2. P/A协商过程 3. 举例说明RSTP的生成树形成过程 3.1 示例环境要求 3.2 RSTP的生成树形成过程 3.2.1 SW和SW1之间链路上抓包分析 3.2.2 SW和SW2之间链路上抓包分析 3.2.3 SW1和SW2之…

CSS重点知识整理1

目录 1 平面位移 1.1 基本使用 1.2 单独方向的位移 1.3 使用平面位移实现绝对位置居中 2 平面旋转 2.1 基本使用 2.2 圆点转换 2.3 多重转换 3 平面缩放 3.1 基本使用 3.2 渐变的使用 4 空间转换 4.1 空间位移 4.1.1 基本使用 4.1.2 透视 4.2 空间旋转 4.3 立…

Type-C连接器笔记

一、Type-C的介绍 Type-C是一种全新的USB接口形式&#xff0c;由USB Implementers Forum&#xff08;USB-IF&#xff09;制定&#xff0c;并在2014年获得苹果、谷歌、英特尔、微软等厂商支持后开始普及。它是一种通用串行总线&#xff08;USB&#xff09;的硬件接口规范&#x…

Stable Diffusion 3 发布及其重大改进

1. 引言 就在 OpenAI 发布可以生成令人瞠目的视频的 Sora 和谷歌披露支持多达 150 万个Token上下文的 Gemini 1.5 的几天后&#xff0c;Stability AI 最近展示了 Stable Diffusion 3 的预览版。 闲话少说&#xff0c;我们快来看看吧&#xff01; 2. 什么是Stable Diffusion…

React18源码: Fiber树中的全局状态与双缓冲

Fiber树构造 在React运行时中&#xff0c;fiber树构造位于 react-reconciler 包在正式解读 fiber 树构造之前&#xff0c;再次回顾一下renconciler的4个阶段 1.输入阶段&#xff1a;衔接react-dom包&#xff0c;承接fiber更新请求2.注册调度任务&#xff1a;与调度中心(schedu…