【LeetCode】654. 最大二叉树

news2024/11/17 13:56:56

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] 中的最大值是 6 ,左边部分是 [3,2,1] ,右边部分是 [0,5] 。
    • [3,2,1] 中的最大值是 3 ,左边部分是 [] ,右边部分是 [2,1] 。
      • 空数组,无子节点。
      • [2,1] 中的最大值是 2 ,左边部分是 [] ,右边部分是 [1] 。
        • 空数组,无子节点。
        • 只有一个元素,所以子节点是一个值为 1 的节点。
    • [0,5] 中的最大值是 5 ,左边部分是 [0] ,右边部分是 [] 。
      • 只有一个元素,所以子节点是一个值为 0 的节点。
      • 空数组,无子节点。

示例 2

输入:nums = [3,2,1]
输出:[3,null,2,null,1]

提示

  • 1 <= nums.length <= 1000
  • 0 <= nums[i] <= 1000
  • nums 中的所有整数 互不相同

2.解题思路

2.1 递归

  • 确定最大值位置,假定为 index
  • 构造节点root,则root.left可以递归构造,范围为[start, index-1]
  • root.right递归构造,范围为[index+1, end]
  • 终止条件 start>end

详见代码。

2.2 单调栈

以 [3,2,1,6,0,5] 为例:

  • 构造节点 3,入栈;
  • 构造节点 2,它比栈顶元素 3 小,所以,它是 3 的右子节点,直接入栈;
  • 构造节点 1,它比栈顶元素 2 小,所以,它是 2 的右子节点,直接入栈;
  • 构造节点 6,它比栈顶元素 1 大,所以,1 是它的左子节点,弹出 1;同样地,栈- 顶元素 2 也比它小,弹出 2 并做为它的左子节点;把栈顶所有比它小的元素都弹出,最后弹出的是 3,所以,最终是 3 做为 6 的左子节点,并把 6 入栈;
  • 构造节点 0,它比栈顶元素 6 小,所以,它是 6 的右子节点,直接入栈;
  • 构造节点 5,它比栈顶元素 0 大,所以,0 是它的左子节点,弹出 0;接着比较,它比栈顶元素 6 小,所以,它是 6 的右子节点,入栈;
  • 最后,栈中元素为 [6,5],栈底元素为 6,是最终的根节点;

动态图最直观,可参见B站大神录制的视频。

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 build(nums, 0, nums.length-1);
    }

    private TreeNode build(int[] nums, int start, int end){
        if(end<start){
            return null;
        }
        //1.找到最大值
        int max=Integer.MIN_VALUE;
        //最大值索引
        int index=start;
        for(int i=start;i<=end;i++){
            if(max<nums[i]){
                max=nums[i];
                index=i;
            }
        }
        //2.构造节点
        TreeNode root=new TreeNode(max);
        //3.左子树
        root.left=build(nums, start, index-1);
        //4.右子树
        root.right=build(nums, index+1, end);
        return root;
    }

    //单调栈
    public TreeNode constructMaximumBinaryTree2(int[] nums) {
        //单调栈
        Deque<TreeNode> stack=new ArrayDeque<>();
        //遍历
        for(int num: nums){
            //构造节点
            TreeNode root=new TreeNode(num);
            //比较当前栈顶元素,若大于num,则其为栈顶元素的右节点;
            //否则,遍历到栈底,将栈底节点置为root的左节点
            while(!stack.isEmpty() && num>stack.peek().val){
                root.left=stack.pop();
            }
            //比栈顶元素小的情况
            if(!stack.isEmpty()){
                stack.peek().right=root;
            }
            //入栈
            stack.push(root);
        }
        return stack.peekLast();
    }
}

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

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

相关文章

美颜SDK的隐私保护与安全性分析

随着智能手机和移动应用的普及&#xff0c;美颜SDK已经成为了很多应用的标配。美颜SDK的使用可以让用户在拍照或者视频聊天时&#xff0c;实现自拍美颜、滤镜、磨皮、瘦脸等效果。但是&#xff0c;在享受美颜SDK带来的便利的同时&#xff0c;我们也需要关注美颜SDK的隐私保护与…

跟着排序学时间复杂度

带着排序学时间/空间复杂度 排序和时间复杂度 带着排序学时间/空间复杂度冒泡排序选择排序选择排序法2原理&#xff1a; 插入排序希尔排序&#xff08;缩小增量排序&#xff09;堆排序快速排序归并排序不基于比较的排序计数排序 桶排序稳定性 时间复杂度是打开数据结构大门的第…

从0搭建Vue3组件库(十二):引入现代前端测试框架 Vitest

Vitest 是个高性能的前端单元测试框架,它的用法其实和 Jest 差不多,但是它的性能要优于 Jest 不少,还提供了很好的 ESM 支持,同时对于使用 vite 作为构建工具的项目来说有一个好处就是可以公用同一个配置文件vite.config.js。因此本项目将会使用 Vitest 作为测试框架。 安装 …

FS2956A 8V~120V降压5V2A4.2V3A恒压芯片

FS2956A 内置MOS 100V开关降压型DC-DC转换器&#xff0c;FS2956A 8-100V用于电动车 滑板车 液晶仪表 5V-USB充电IC方案2A 概述&#xff1a; FS2956A 是一款支持宽电压输入的开关降压型DC-DC&#xff0c;芯片内置100V/5A功率MOS&#xff0c;最高输入电压90V。FS2956A 具有低待…

初识滴滴交易策略之一:交易市场

初识系列前言 滴滴作为一家共享出行公司&#xff0c;利用信息技术构建了实时的、智能的在线交易市场&#xff0c;在这个庞大运转的市场之中&#xff0c;滴滴秉承着用户价值至上的宗旨&#xff0c;不断通过技术提升来实现更高效的运转效率和更贴心的用户体验。 为了使得大家能够…

蚂蚁实时低代码研发和流批一体的应用实践

摘要&#xff1a;本文整理自蚂蚁实时数仓架构师马年圣&#xff0c;在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为四个部分&#xff1a; 1. 实时应用场景与研发体系 2. 低代码研发 3. 流批一体 4. 规划展望 Tips&#xff1a;点击「阅读原文」查看原文视频&a…

KingbaseES V8R6备份恢复系列之 -- system-Id不匹配备份故障

​ KingbaseES V8R6备份恢复案例之---system-Id不匹配备份故障 案例说明&#xff1a; 在KingbaseES V8R6执行备份时&#xff0c;在sys_log日志中出现system-id不一致的故障并伴随有归档失败&#xff0c;故障如下图所示&#xff1a; 适用版本&#xff1a; KingbaseES V8R6 一、问…

React 学习笔记

文章目录 React 简介React 特点React 学习前提React 第一个实例 React 简介 React 是一个用于构建用户界面的 JAVASCRIPT 库。 React主要用于构建UI&#xff0c;很多人认为 React 是 MVC 中的 V&#xff08;视图&#xff09;。 React 起源于 Facebook 的内部项目&#xff0c;用…

Flink窗口

目录 窗口 Flink “存储桶” 窗口分类 按照驱动类型分类 按照窗口分配数据的规则分类 滚动窗口 滑动窗口 会话窗口 全局窗口 窗口的生命周期 窗口 窗口&#xff1a;将无限数据切割成有限的“数据块”进行处理&#xff0c;以便更高效地处理无界流 在处理无界数据流时…

3.1 掌握绘图基础语法与常用参数

3.1 掌握绘图基础语法与常用参数 3.1.1 掌握pyplot基础语法1.创建画布与创建子图2.添加画布内容3.保存与展示图形 3.1.2 设置pyplot的动态rc参数线条常用的rc参数 Matplotlib库介绍 Matplotlib是Python中最常用的可视化工具之一&#xff0c;可以非常方便地创建海量类型的2D图表…

实验二十、压控电压源二阶 LPF 幅频特性的研究

一、题目 研究压控电压源二阶低通滤波电路品质因数 Q Q Q 对频率特性的影响。 二、仿真电路 电路如图1所示。集成运放采用 LM324AJ&#xff0c;其电源电压为 15V。 图 1 压控电压源二阶低通滤波电路幅频特性的测试 图1\,\,压控电压源二阶低通滤波电路幅频特性的测试 图1压控…

记录一次重装系统配置工作环境

128G固态换大硬盘&#xff0c;偷懒不想重装系统&#xff0c;利用diskgenius迁移系统&#xff0c;热迁移和PE都没能成功迁移&#xff0c;还不小心删掉了机械盘的所有分区。利用diskgenius搜索分区&#xff0c;恢复文件&#xff0c;勉强把一些数据文件保存下来了。但是软件又得重…

DOM是什么(DOM的节点类型)

学到DOM时&#xff0c;看到关于文档&#xff08;结构树&#xff09;、节点&#xff08;node&#xff09;、和DOM提供的一些方法获取&#xff08;找到&#xff09;所需的节点、还有DOM属性&#xff0c;我很混乱&#xff0c;我无法弄清节点的关系层级属性和方法的关系&#xff0c…

SQL常用语句总结

一&#xff0c;简介 1.1 数据库是用来存放数据的&#xff0c;对数据库的操作需要用到SQL语句 1.2 数据库种类有也非常多&#xff1a; 关系型数据库&#xff1a; Oracle、DB2、Microsoft SQL Server、Microsoft Access、MySQL、SQLite 非关系型数据库&#xff1a; NoSql、Cl…

Vue Cli 之 环境变量和模式

一、环境变量 ​ 我们在使用 Vue-cli 创建的Vue项目中&#xff0c;可以在构建和运行时为项目设置环境变量&#xff0c;这些环境变量会根据环境&#xff08;模式&#xff09;的不同&#xff0c;而自动注入到项目中&#xff0c;也就是说我们可以根据环境不同&#xff0c;设置不同…

二进制单节点搭建 Kubernetes v1.20

目录 第一章.操作系统初始化配置 1.1.安装环境部署 1.2.部署 docker引擎 第二章.部署 etcd 集群 2.1.ETCD简述 2.2.准备签发证书环境 在 master01 节点上操作 2.3. 生成Etcd证书​​​​​​​ 2.4.在 node01 节点上操作 在 node02 节点上操作 2.5.部署 Master 组件…

SpringBoot ( 四 ) 接值

2.5.接值 通过方法的参数来接收请求传来值 请求时传值的方式有三种方式 : URL?namevalueform表单Ajax 异步传值 接收传来的值有三类 : 单一值对象数组 2.5.0.传值 2.5.0.1.URL?传值 URL?标识1值1&标识2值2 URL后面使用 ? 连接参数, 每组参数使用 连接标识与值, 多…

10.过滤器

过滤器是做文本格式化的&#xff0c;只能用在 插值表达式 与 v-bind 上&#xff0c;在vue3中已经被弃用了&#xff0c;这里我简单记录一下并写一下在vue3的替代方法 目录 1 基本使用 1.1 vue2中的写法 1.2 vue3的替代 2 私有过滤器与全局过滤器 2.1 vue2的写法 2.2…

shell脚本----数组

文章目录 一、数组定义的方法二、数组的操作2.1 数组的输出2.2 删除数组2.3 数组切片2.4 数组的替换2.5 判断数组中是否有空值2.6 追加函数2.7 向函数传入参数 一、数组定义的方法 数组定义的规则 数组中的每个元素分分隔符一定为空格隔开每个元素都拥有与其对应的下标&#…

Kubesphere流水线实现蓝绿发布

Kubesphere流水线实现蓝绿发布 1. Gitlab仓库准备 1.1 创建仓库 新建空白项目,名字随便取 greenweb复制克隆地址 http://192.168.31.199/deploy/greenweb.git1.2 初始化并上传代码 克隆并初始化代码仓库 mkdir git cd git git clone http://192.168.31.199/deploy/green…