C++算法练习-day39——654.最大二叉树

YOLOv8【第四章:注意力机制篇·第20节】一文讲透,注意力机制设计原则与选择指南 - 从原理到实践的系统化方法论! 🏆 本文收录于 《YOLOv8实战:从入门到深度优化》,该专栏持续复现网络上各种热门内容(全网YOLO改进最全最新的专栏,质量分97分+,全网顶流),改进内容支持(分类、检测、分割、追踪、关键点、OBB检测)。且专栏会随订阅人数上升而涨价(毕竟不断更新),当前性价比极高,有一定的参考&学习价值,部分内容会基于现有的国内外顶尖人工智能AIGC等AI大模型技术总结改进而来,嘎嘎硬核。    ✨ 特惠福利:目前活动一折秒杀价!一次订阅,永久免费,所有后续更新内容均免费阅读! 阅读详情

题目来源:. - 力扣(LeetCode)

题目思路分析

题目描述

给定一个无序的整数数组,你需要构建一棵最大二叉树。在这棵二叉树中,每个节点的值都大于其子树中所有其他节点的值。换句话说,每个节点都是其子树中的最大值节点。根据这个定义,我们需要编写一个函数来构建这样的二叉树。

思路分析
  1. 方法一:单调栈

    • 使用一个栈来存储数组元素的索引,栈中的索引对应的元素值是单调递减的。
    • 遍历数组,对于每个元素,如果栈不为空且当前元素大于栈顶索引对应的元素值,则不断弹出栈顶元素,并将弹出的元素作为当前元素的左子节点。
    • 弹出结束后,如果栈不为空,则栈顶元素对应的节点为当前元素的右子节点的父节点(或祖父节点等,取决于之前弹出的元素数量)。
    • 将当前元素的索引压入栈中。
    • 最后,栈中剩余的索引对应的节点中,栈底的索引对应的节点即为整棵树的根节点。
  2. 方法二:递归

    • 递归地找到子数组中的最大值及其索引。
    • 以最大值为根节点创建一个新的树节点。
    • 递归地构建左子树和右子树,左子树由最大值左侧的子数组构建,右子树由最大值右侧的子数组构建。
    • 返回构建好的节点。

代码:

方法一:单调栈

class Solution {  
public:  
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {  
        int n = nums.size();  
        vector<int> value; // 用于存储数组元素的索引,保持栈中索引对应的元素值单调递减  
        vector<TreeNode*> tree(n); // 用于存储每个索引对应的树节点  
          
        for (int i = 0; i < n; ++i) {  
            tree[i] = new TreeNode(nums[i]); // 为当前元素创建一个新的树节点  
              
            // 当栈不为空且当前元素大于栈顶索引对应的元素值时,处理左子树  
            while (!value.empty() && nums[i] > nums[value.back()]) {  
                tree[i]->left = tree[value.back()]; // 将弹出的索引对应的节点作为当前节点的左子节点  
                value.pop_back(); // 弹出栈顶索引  
            }  
              
            // 如果栈不为空,则栈顶索引对应的节点为当前节点的右子节点的父节点(或更上层的节点)  
            // 但由于我们是从左到右遍历的,所以这里只需要将当前节点设置为栈顶索引对应节点的右子节点即可  
            // 之前的左子树构建已经确保了正确的父子关系  
            if (!value.empty()) {  
                tree[value.back()]->right = tree[i];  
            }  
              
            value.push_back(i); // 将当前索引压入栈中  
        }  
          
        // 栈底索引对应的节点即为整棵树的根节点  
        return tree[value[0]];  
    }  
};

方法二:递归

class Solution {  
public:  
    // 递归函数,用于构建最大二叉树  
    TreeNode* construct(const vector<int>& nums, int begin, int end) {  
        // 递归终止条件:子数组为空  
        if (begin > end) {  
            return nullptr;  
        }  
          
        // 找到子数组中的最大值及其索引  
        int max = begin;  
        for (int i = begin + 1; i <= end; ++i) {  
            if (nums[i] > nums[max]) {  
                max = i;  
            }  
        }  
          
        // 以最大值为根节点创建一个新的树节点  
        TreeNode* node = new TreeNode(nums[max]);  
          
        // 递归构建左子树和右子树  
        node->left = construct(nums, begin, max - 1);  
        node->right = construct(nums, max + 1, end);  
          
        // 返回构建好的节点  
        return node;  
    }  
      
    // 主函数,调用递归函数构建最大二叉树  
    TreeNode* constructMaximumBinaryTree(vector<int>& nums) {  
        return construct(nums, 0, nums.size() - 1);  
    }  
};

知识点摘要

  • 单调栈:用于解决一些与数组元素顺序相关的问题,通过维护一个单调的栈来优化算法。
  • 递归:一种在函数内部调用自身的方法,常用于解决可分解为相似子问题的问题。
  • 二叉树:一种数据结构,其中每个节点最多有两个子节点,称为左子节点和右子节点。

本文介绍了两种从无序整数数组构建最大二叉树的方法:单调栈和递归。单调栈方法通过维护一个单调递减的栈来构建二叉树,而递归方法则通过递归地找到子数组中的最大值来构建二叉树。两种方法各有优缺点,单调栈方法在某些情况下可能更高效,而递归方法则更直观易懂。无论使用哪种方法,都需要对二叉树的基本结构和操作方法有深入的理解。通过这两种方法的比较和学习,我们可以更好地理解数据结构中的算法设计和优化。

1.4 点云数据获取方式——结构光相机 与此同时,利用相机从特定角度捕捉变形后的图案,基于三角测量原理,通过精确计算相机与投影仪之间的几何关系以及图案的变形程度,就能准确计算出物体表面各点的三维坐标,从而获取高精度的三维点云数据。在高端制造业中,对于微小零部件的尺寸测量和缺陷检测,结构光相机能够提供极其精确的数据,确保产品质量符合严格的标准。时序编码:这类相机通过序列投射多幅不同图案,如格雷码、相移条纹等,通过对这一系列图案的时间序列进行解码分析,就能够获取亚像素级精度的三维信息,其单点误差能够控制在≤0.1mm,展现出极高的测量精度。 阅读详情

相关推荐

从零搭建AMESim与Matlab/Simulink联合仿真环境(2024版软件配置详解)

本文详细介绍了2024年最新版AMESim与Matlab/Simulink联合仿真环境的搭建与配置方法。从软件安装顺序、路径设置到编译器配置,逐步指导如何实现高效联合仿真,特别强调了版本兼容性和环境变量设置等关键细节,帮助工程师快速解决常见问题并优化仿真性能。

weixin_42538752的博客 735

力扣:654. 最大二叉树(单调栈)

本质上,我们考虑到,在单调栈中,我们就可以找到所有结点的儿子(或确定所有结点的父亲),因此我们需要思考,是否存在一种方法直接在单调栈运行过程中找到所有儿子?单调栈的方法不容易一次性想到,不过仔细思考我们可以观察到这样一个事实,也是。我们理解了这一个过程,相信读者就更容易思考了。内,选出最大值,递归构建结点即可。下面,我们将使用数字值代表树节点。递归的方法很容易实现,给定函数。

m0_63997099的博客 1250

【02】【VisionMaster V4.0.0 】安装教程—— 授权文件更新报错:应用程序与本地LM通讯出错(怀疑电脑加密 和 上网受限 造成的 )

本文详细介绍了海康VisionMaster 4.0试用版的安装流程及常见问题解决方案。主要内容包括:1)从官网下载基础安装包、试用补丁和授权文件;2)按顺序安装主程序、补丁和授权文件;3)针对授权失败问题提供两种解决方案(更换未加密电脑或使用加密狗);4)说明试用版的功能限制(30天试用期、2个流程限制等)。文章特别指出电脑加密可能导致授权失败,并提供了安装报错时的处理建议,为初次使用者提供了完整的安装指导。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 7175

leetcode 最大二叉树

题目链接 思路一:递归 分析:题目就是让找出每次在范围内的最大值为根节点 代码: /** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int

weixin_42496727的博客 262

HyperMesh实战:5种复杂载荷场景下的field映射技巧(附TCL脚本)

本文详细介绍了HyperMesh在5种复杂载荷场景下的field映射技巧,包括轴承载荷的圆柱坐标系映射、粉末压力中的切向力处理、实验数据到有限元模型的场映射、多工况载荷的组合映射以及局部细化网格的边界条件传递。通过实战案例和TCL脚本,帮助工程师高效解决有限元分析中的载荷映射难题,提升工作效率。

fanta的博客 294

JavaFx之集成FontAwesomeFX与JFoenix(十五)

本文详细介绍了如何在JavaFx项目中同时集成JFoenix和FontAwesomeFX,以创建现代化、美观的桌面应用界面。通过Maven依赖配置、动态代码创建和FXML静态声明两种方式,演示了如何将JFoenix的Material Design控件与FontAwesomeFX的丰富矢量图标完美结合,并提供了实战案例展示如何构建一个功能完善的现代化工具栏。

pepsi的博客 437

深挖C++:类和对象(中)

(先进后出)

xys_678的博客 250

保姆级教程:用ArcGIS Pro搞定云南30米分辨率DEM地形图(附数据下载与配色方案)

本文提供了一份详细的ArcGIS Pro教程,指导用户如何制作云南30米分辨率DEM地形图。从数据下载、预处理到镶嵌与质量控制,再到地形分析与可视化,全流程覆盖云南复杂地形的处理要点。特别包含数据下载链接、配色方案及常见问题解决方案,适合地理信息分析新手和专业人士。

weixin_30467199的博客 309

ThunderKittens 深度解析:一个不基于 MLIR 的 C++ 模板 GPU DSL

Triton 是"让更多人能写 GPU kernel",ThunderKittens 是"让会写的人写得更爽"。前者用 MLIR 换易用性,后者用 C++ 模板换可控性。它们不是替代关系,而是覆盖了 GPU 编程光谱的两端。ThunderKittens 的出现,本质上是对"GPU DSL 必须基于 MLIR"这一默认假设的挑战。编译期类型系统本身就可以是一个强大的 DSL 基础设施,不需要中间 IR,不需要黑盒 pass,也能实现 tile 级抽象和零运行时开销。

Maxwell_Newton的博客 348

SCADA|测试KingSCADA4.0信创版采集汇川PLC AC810数据

摘要:雷工分享KingSCADA4.0信创版采集汇川PLC数据的配置过程。由于项目繁忙,笔记更新延迟。信创产业要求采用国产化产品,此次通过ModbusTCP协议连接AC810 PLC。主要步骤包括:新建IOServer应用(需厂家协助从3.8升级至4.0)、安装ModbusTCP驱动、配置设备地址(192.168.1.88:5021)、运行IOServer并通过网页监控变量。尽管信创版操作体验较差,但出于国产化战略需要仍需使用。雷工表示理解产品初期不足,相信未来会逐步优化。2025年4月11日记录于四川绵阳

做有价值的事,积累有价值的笔记! 864

vmvare kali如何配置桥接模式进行上网

注意点:虚拟机可以PING通物理机,但是PING不通其他的网站。经过收集资料,得知由于是校园网连接,所以DHCP只能分配一个授权的IP地址给连接的主机,由于KALI是桥接物理机,物理机已经获得了这个授权的IP,所以导致桥接的虚拟机无法上网。所以不是因为配置的有问题,而是网络的安全设置导致了桥接失败。如果你是使用校园网,可以换个网络试试,使用校园网的时候,可能会遇到桥接失败。

猿小白的博客 1409

C++移动构造函数详解

移动构造函数是C++11引入的一种特殊构造函数,用于从临时对象(右值)"窃取"资源来初始化新对象,而不是进行昂贵的深拷贝。char* data;public:// 移动构造函数:参数是右值引用 &&// 关键:把源对象的资源置空。

拒绝AI文,努力在AI时代写出感动人心的好文章 394

Cesium 实战 28 - 三维视频融合(视频投影)

Cesium 实战 27 - 三维视频融合(视频投影)。

非科班Java出身GISer的博客 3369

跟我学c++中级篇—类型定义的方式

本文系统阐述了编程中类型定义的重要性及c++中的实现方式。重点对比了宏定义、typedef与modern using三种机制,指出using在可读性、灵活性和模板支持上的优势,推荐优先使用。同时提醒开发者注意别名滥用、类型歧义、错误信息冗长等问题,强调统一规范与合理设计。最终结论:在现代c++开发中,应以using为主,兼顾简洁性与可维护性,避免陷入命名混乱与编译困境。

fpcc的专栏 86

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

C++ 函数模版

模板参数:● template ,T 就是类型占位符,名字可以自定义,习惯用T● 占位符可以在函数返回值、形参、函数内部当作类型使用使用要点模板代码一般写在头文件:编译器需要看到完整模板源码,才能在每个编译单元完成实例化全局函数、类内成员函数都可以写成模板实例化发生在编译阶段,不是运行时隐式实例化:调用时编译器自动推导实参类型,生成对应版本函数。

2501_94041724的博客 306

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

C++ 运行时多态与虚函数机制全面剖析【面试重点】

构成C++ 运行时多态必须是基类的指针或者引用调用虚函数。被调用的函数必须是虚函数,并且派生类必须对该虚函数完成重写/覆盖(Override)。只有基类的指针或引用才能既指向基类对象,又指向派生类对象(切片机制);而只有完成了虚函数重写,派生类与基类才具备不同的函数行为,达到“指向谁就调用谁”的效果。在类成员函数的前面加上virtual关键字修饰,该成员函数就成为了虚函数。public:// 成员函数前加 virtual 修饰,声明为虚函数。

Fuyo_0209的博客 448

#SQLite 数据库笔记一:(概念 / 终端指令 / SQL 语句 / C 编程 / 回调函数)

数据库 = 数据的仓库,假设数据是海量。能力说明存储数据持久化保存,程序退出数据还在统计数据、分组、排序数据管理增、删、改、查(CRUD)嵌入式设备上也会用数据库(单片机网关、路由器、工业 HMI 都常见),因为 sqlite 体积小、无需服务进程、单文件即可。数据库 = 库 > 表 > 记录(行) > 字段(列)sqlite3 = 开源、C 写的、单文件、免安装、最多 2T 的嵌入式关系型数据库。

lwq20051110的博客 235

蓝桥杯·全国青少年信息素养大赛·电子学会Python/C++考级 备考:莫队算法离线区间查询详解

备赛进行时:第十八届蓝桥杯软件赛报名已于 2026-10-08 10:00 开启、12-18 14:00 截止,省赛定在 2027-04-10(C/C++·Python 程序设计 9:00–13:00);中国电子学会 2026 年 12 月软件编程(C/C++ 一级至十级、Python 一级至六级)考级报名 9/23–12/2 16:00、统考 12-12;全国青少年信息素养大赛 2026—2027 赛季算法应用主题赛也已进入复盘练兵窗口。

IT_Scratch的博客 164

【C++ 基础入门】C++继承(下):问题、底层原理与组合

C++继承(菱形继承的问题、虚继承原理、继承与组合、构造顺序)

2601_96587588的博客 798

825 mW 顶上 212 °C:ASM491S 的 105 °C/W、250 mA 短路电流与热关断

25 °C 环境里结温 34.1 °C,125 °C 环境里结温 134.1 °C——后者已经离 150 °C 只有 16 °C 了,但还在范围内。换个角度看同一件事:从 25 °C 和从 125 °C 起算,温升都是 86.6 °C,但一个到 111.6 °C(还在范围内),一个到 211.6 °C(远远超限)。这个算例里 20 °C/W 是我假设的,实际值取决于机壳材料、密封程度、有没有风扇,跨度可以从 5 °C/W 到 50 °C/W 以上。外面 50 °C 的机箱,盒内就是 63.9 °C。

ANSILIC的博客 389

《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试

本文系统完成了Gemini模型通过OpenAI兼容API的接入开发,基于Apifox验证接口规范,设计并实现GeminiProvider类,涵盖初始化、状态检测、全量响应等核心功能。重点处理了代理配置强制校验、Bearer鉴权、JSON序列化与响应解析等工程细节,并通过GTest与CMake完成单元测试,验证链路可用性。项目遵循策略模式,保持与DeepSeek、ChatGPT等模型的统一抽象接口,显著提升SDK可扩展性。

2501_91275995的博客 396

【容斥原理计数】题解:P9489 ZHY的表示法_容斥原理_计数问题_前缀和问题转化_算法竞赛C++

给定 $ n $ 个正整数,求区间 $[l,r]$ 中有多少正整数 $ x $ 可表示为 $ \sum \lfloor \frac{y}{x_i} \rfloor $。通过二分确定最大 $ y $,转化为求 $ 1 \sim H $ 中是某些 $ x_i $ 倍数的数的个数,利用容斥原理与 DFS 枚举子集计算,结合 LCM 预判剪枝及去重优化,时间复杂度 $ O(2^n \log V) $,可高效处理 $ r \le 10^9 $ 的数据。

YLCHUP的博客 105

头歌 数据结构——C&C++线性表实训

本系列任务围绕线性表的链式实现,依次完成顺序构建、逆序构建、排序插入、查找、删除、求长度及栈、队列、集合等应用。通过动态内存分配与指针操作,掌握单链表的基本操作与实际应用,涵盖插入、删除、遍历、搜索等核心功能,最终实现数据结构在典型场景中的灵活运用。

一名敲代码的苦13程序员 244

字母移动游戏题解:贪心求最长可保留连续子串(附 C 实现)

本题核心思想是:最少移动步数 = 总长度 - 可保留的最长连续子串长度。未移动字母在T中必须为连续子串,在S中需保持相对顺序(即子序列)。通过枚举T的所有连续子串起点,贪心匹配S中的对应字符,求出最长可保留长度L,答案即为n−L。时间复杂度O(n²),空间复杂度O(n),适用于n≤1000。

冻柠茶飞冰走茶 589

C++ vector 添加与删除元素的底层原理:erase 返回值与倒序遍历删除

vector是连续内存的动态数组,支持O(1)随机访问,但扩容时需重新分配内存并搬迁元素。push_back和emplace_back均摊时间复杂度为O(1),扩容策略(如2倍或1.5倍)确保总代价均摊;insert与erase在中间位置操作需移动元素,时间复杂度O(n),且使后续迭代器失效。删除指定元素推荐使用erase-remove惯用法或std::erase_if,避免逐个删除导致O(n²)复杂度。从后往前遍历可防止漏删,但最优解仍是高效惯用法。预估容量后调用reserve()可避免频繁扩容,提升性能

2402_85743155的博客 798

C++ 标准库算法全景指南

本文系统梳理C++标准库<algorithm>与<numeric>中100+算法,按功能分为非修改、修改、排序、二分查找、归并、堆、极值、字典序、排列及数值操作十大类,涵盖典型用法与时间复杂度。结合C++20范围(ranges)与投影特性,实现更简洁高效的代码。

sss123ddd的博客 384

CuTe 与 CuTe DSL:从 C++ 模板元编程到 Python DSL 的 GPU 编程演进

CuTe 的价值不在于它"好用",而在于它把 GPU 编程中最难表达的部分——布局与线程映射——变成了可以做代数运算的数学对象。它坚持 C++ 模板路线,拒绝引入编译器黑盒,换来了极致的可控性与性能上限,代价是陡峭的学习曲线与糟糕的报错体验。CuTe DSL 的出现,说明这个团队也意识到了"曲高和寡"的问题,正在尝试用 Python 的易用性包裹 C++ 模板的强大。未来 CuTe 大概率会继续扮演"底层布局中间层"的角色,而 DSL 层则负责把这份能力交付给更多开发者。

Maxwell_Newton的博客 256
上一篇: C++算法练习-day38——106.从中序和后序遍历序列构造二叉树
下一篇: C++算法练习-day40——617.合并二叉树
Neophyte0608
博客等级 码龄3年 808粉丝 98原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

Neophyte0608

你的鼓励将使我创作学的更加快乐

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

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

打赏作者

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

抵扣说明:

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

余额充值