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

冲刺大厂之 Java 刷题总结 将该专栏的题目刷完,仔细学习整理,冲刺大厂没问题加油!!!! 文章目录一、数组二、链表三、哈希表四、字符串五、双指针法六、栈与队列七、二叉树八、回溯法九、贪心算法十、动态规划十一、单调队列十一、输入输出练习十二、补充目录十三、真题练习十四、扩展目录 一、数组 序号 题目 知识点 01 关于数组你不得不知道的事 数组方法总结 35 搜索插入位置 二分法总结 27 移除元素 双指针法 209 长度最小的子数组 滑动窗口 59 螺旋矩阵 II 模拟数组,关键确定边界条件 二 阅读详情
java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.youkuaiyun.com/grd_java/article/details/123063846

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

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;//栈顶指针,初始-1
        for (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;
    }
}
Open Dynamics Engine(ODE)物理引擎基础教程(I)——特点介绍 下一教程 Open Dynamics Engine(ODE)物理引擎基础教程(II)——相关概念 (在这一教程中将学习刚体、关节、碰撞的概念在ODE中的特点) 本文结构引言介绍特点使用ODE总结 引言 本文翻译自ODE官方教程英文版,有些地方增加了自己的理解。这一节介绍ODE的相关概念。 基础教程英文原版链接【http://ode.org/wiki/index.php?title=Manua... 阅读详情

相关推荐

基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战解析

本文详细解析了基于ROS2 Humble与Livox Mid-360的双雷达点云融合实战方案。从环境搭建、驱动安装、双雷达配置、外参标定、时间同步到点云融合核心实现,全面介绍了技术要点与避坑指南,并提供了工程化部署与性能优化建议,助力开发者高效实现高精度点云合成应用。

ss78901的博客 1094

Leetcode654. 最大二叉树

Leetcode654. 最大二叉树 题目: 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树,并且输出这个树的根节点。 示例 : 输入:[3,2,1,6,0,5] 输出:返回下面这棵树的根节点: 6 / \ 3 5 \ / 2 0

会流泪de鱼的博客 323

CTFShow萌新区全攻略:从密码破解到Web渗透的实战解析

本文为CTFShow萌新区新手提供从密码破解到Web渗透的完整实战攻略。文章深入解析了密码学、隐写术、杂项和Web安全四大核心方向,分享了实用的解题工具、思维方法和绕过技巧,旨在帮助初学者建立系统的安全竞赛解题体系,而不仅仅是提供一份题解(WP)。

weixin_29216957的博客 299

654. 最大二叉树

本文详细解析了构建最大二叉树的递归算法。通过定义递归函数,在子数组中找到最大值作为根节点,并递归构建左右子树。时间复杂度为O(n²),空间复杂度为O(n)。文章还提出了使用单调栈优化至O(n)的思路,并探讨了相关扩展问题。该算法体现了分治思想在树结构问题中的应用,是理解递归构建二叉树的典型案例。

mrjieke6的博客 592

Telegram 担保交易系统搭建指南:安全可靠的交易流程实现

本文介绍了基于Telegram Bot API搭建担保交易系统的完整方案。该系统通过第三方资金托管机制解决买卖双方信任问题,支持"付款后发货"和"收货后放款"的交易流程。文章详细阐述了系统架构设计,包括Telegram Bot交互层、后端业务逻辑层、数据库层和支付接口层。核心实现步骤涵盖:1)订单创建模块处理交易信息;2)支付处理模块集成Stripe Escrow实现资金托管;3)确认收货模块完成资金划转。系统采用PostgreSQL存储交易数据,并通过FastAPI

jingpide9527的博客 1960

在线机器学习(OML-AD)应对时序数据概念漂移的异常检测实战

时序数据异常检测是监控系统健康、识别业务风险的核心技术。其基本原理是通过预测模型学习数据的正常模式,并将预测误差作为异常判定的依据。然而,当数据背后的统计规律随时间发生变化,即发生概念漂移时,传统的静态模型会失效,导致误报和漏报激增。在线机器学习技术通过增量学习,使模型能够随每个新数据点实时微调,为预测式异常检测提供了动态适应能力,从而在数据流持续演化的场景下保持检测的鲁棒性。这种将预测与检测无缝衔接的OML-AD框架,尤其适用于工业监控、金融风控等对实时性与资源效率要求高的领域,有效解决了概念漂移这一核心

weixin_29889665的博客 533

Java实现 LeetCode 654 最大二叉树(递归)

654. 最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。...

5431

coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?

🏆本文收录于《优快云问答解惑-专业版》专栏,主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!

**My Coding Family** 2670

代码随想录刷题day17丨654.最大二叉树,617.合并二叉树,700.二叉搜索树中的搜索,98.验证二叉搜索树

文档讲解:https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html解题思路:递归(前序遍历)

m0_75195038的博客 1049

YOLOv11涨点改进 | 全网创新首发、主干改进篇 | CVPR 2025 | RAVLT主干让 YOLOv11 更加强大!通过增强线性注意力机制,特别在小目标和复杂背景的检测上表现突出

本文提出RAVLT主干网络,通过改进YOLOv11的空间特征建模能力,显著提升小物体和复杂背景检测性能。RAVLT采用秩增强线性注意力(RALA)机制,在保持线性计算复杂度的同时解决传统线性注意力低秩问题。RALA通过增强KV缓冲区和输出特征矩阵的秩,提高特征多样性和建模能力。实验表明,RAVLT在ImageNet-1k上达到84.4% Top-1准确率,仅需2600万参数和4.6GFLOPs,性能优于现有线性注意力模型。文章详细介绍了RAVLT模块结构、实现原理及在YOLOv11中的集成方法,包含四种主干

Ai缝合怪、助力小伙伴高效发论文 640

第二节:Vben Admin 最新 v5.0 (vben5) + Python Flask 快速入门 - Python Flask 后端开发详解(附源码)

大家好,我是cuiwin!本节内容,我们从零开始开发基于Python(Flask)的后端项目,对接Vue Vben Admin(vben5)。登录mysql数据库执行: 创建数据库。

cuiwin的专栏 2269

654.最大二叉树(二叉树算法)

题目总结:最大二叉树的构建 本题要求根据不重复整数数组构建最大二叉树,核心是递归分治:每次选取当前区间最大值作为根节点,左侧子数组构建左子树,右侧子数组构建右子树。关键步骤包括:1) 遍历区间确定最大值及索引;2) 创建根节点;3) 划分左右子区间;4) 递归构建子树。采用左闭右开区间处理可简化边界条件,时间复杂度平均O(nlogn),最坏O(n²)。需注意区间划分准确性(如右子树起始索引为maxIndex+1)和空区间终止条件,避免越界或无限递归。典型错误包括初始值设置不当或区间范围混淆。此解法直观体现了

m0_68880377的博客 778

腾讯滑块验证码防水墙 tdc.js 补环境实录

腾讯滑块验证码破解研究摘要 本文记录了破解腾讯防水墙滑块验证码(tdc.js)的全过程。研究重点包括: 流程分析:通过抓包分析验证码完整链路,识别出关键参数collect和eks需从tdc.js虚拟机获取 环境模拟:采用渐进式补环境方法,针对字节码虚拟机特性构建完整的window对象,包括navigator、screen、canvas等API的精确模拟 核心破解:成功调用TDC.getData()和TDC.getInfo()获取关键参数,解决POW计算和滑块缺口识别问题 优化调整:针对errorCode 5

码王吴彦祖的博客 235

【算法】654. 最大二叉树(多语言实现)

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

二当家的白帽子 296

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

代码随想录算法训练营Day17 | 654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

训练营第17天:654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树

jiabao0520的博客 1220

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

leetcode 654.最大二叉树 Java

最大二叉树题目链接描述示例初始代码模板代码 题目链接 https://leetcode-cn.com/problems/maximum-binary-tree/ 描述 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树,并且输出这个树的根节点。 提示: 给定的数组的大小在 [1, 1000] 之间。 示例 输入:

博主是个二次元死肥宅~ 403

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

​力扣解法汇总654-最大二叉树

​力扣解法汇总654-最大二叉树

分享+记录 308

LeetCode刷题系列 -- 654. 最大二叉树

题目: 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树,并且输出这个树的根节点。 示例 : 输入:[3,2,1,6,0,5] 输出:返回下面这棵树的根节点: 6 / \ 3 5 \ / 2 0 \ 1...

qq_33775774的博客 209

Leetcode 654:最大二叉树(超详细的解法!!!)

给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树,并且输出这个树的根节点。 Example 1: 输入: [3,2,1,6,0,5] 输入: 返回下面这棵树的根节点: 6 / \...

coordinate的博客 2193

力扣654 最大二叉树 java实现

本文介绍了如何构建最大二叉树的算法。该算法通过递归方式实现:首先在数组中找到最大值作为根节点,然后对最大值左侧和右侧的子数组分别递归构建左右子树。文章提供了Java实现代码示例,演示了对输入数组[3,2,1,6,0,5]的处理过程,最终输出对应的二叉树结构。该解法采用分治思想,时间复杂度主要取决于查找最大值和数组分割操作。

m0_58648798的博客 436

【LeetCode】654. 最大二叉树(Java)

题目: Given an integer array with no duplicates. A maximum tree building on this array is defined as follow: The root is the maximum number in the array. The left subtree is the maximum tree construc...

龙套的博客 435

leetcode654 最大二叉树

labuladong 写树的算法,关键思路如下: 把题目的要求细化,搞清楚根节点应该做什么,然后剩下的事情抛给前/中/后序的遍历框架就行了,我们千万不要跳进递归的细节里,你的脑袋才能压几个栈呀。 题目链接: leetcode654 最大二叉树 解题基础: Integer.MAX_VALUE/Integer.MIN_VALUE的用法:在一堆数字里找最大值和最小值的简单方法 本题思路: 函数签名如下: TreeNode constructMaximumBinaryTree(int[] nums); 按照我.

去创造 195

LeetCode_二叉树_中等_654.最大二叉树

目录1.题目2.思路3.代码实现(Java) 1.题目 给定一个不重复的整数数组 nums 。 最大二叉树可以用下面的算法从 nums 递归地构建: 创建一个根节点,其值为 nums 中的最大值。 递归地在最大值左边的子数组前缀上构建左子树。 递归地在最大值右边的子数组后缀上构建右子树。 返回 nums 构建的最大二叉树 。 示例 1: 输入:nums = [3,2,1,6,0,5] 输出:[6,3,5,null,2,0,null,null,1] 解释:递归调用如下所示: - [3,2,1,6,0,5]

代码星辰的博客 1527

刷题计划day17 二叉树(六)【 从中序与后序遍历序列构造二叉树】【从中序与后序遍历序列构造二叉树】【最大二叉树】

刷题计划day17 二叉树(六),二叉树会有十期专题【 从中序与后序遍历序列构造二叉树】【从中序与后序遍历序列构造二叉树】【最大二叉树】,可以点个免费的赞哦~ 往期可看专栏,关注不迷路,

weixin_72499901的博客 509

Leetcode 654.最大二叉树

最大二叉树 给定一个不含重复元素的整数数组。一个以此数组构建的最大二叉树定义如下: 二叉树的根是数组中的最大元素。 左子树是通过数组中最大值左边部分构造出的最大二叉树。 右子树是通过数组中最大值右边部分构造出的最大二叉树。 通过给定的数组构建最大二叉树,并且输出这个树的根节点。 Example 1: 输入: [3,2,1,6,0,5] 输入: 返回下面这棵树的...

kexinxin1的博客 307
上一篇: java数据结构与算法刷题-----LeetCode513. 找树左下角的值
下一篇: java数据结构与算法刷题-----LeetCode617. 合并二叉树
ydenergy_殷志鹏
博客等级 码龄7年 5886粉丝 543原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ydenergy_殷志鹏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值