Leetcode 剑指 Offer II 044. 在每个树行中找最大值

news2025/1/11 23:40:11

题目难度: 中等

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。

示例 1:

  • 输入: root = [1,3,2,5,3,null,9]
  • 输出: [1,3,9]
  • 解释:
          1
         / \
        3   2
       / \   \
      5   3   9

示例 2:

  • 输入: root = [1,2,3]
  • 输出: [1,3]
  • 解释:
          1
         / \
        2   3

示例 3:

  • 输入: root = [1]
  • 输出: [1]

示例 4:

  • 输入: root = [1,null,2]
  • 输出: [1,2]
  • 解释:
           1
            \
             2

示例 5:

  • 输入: root = []
  • 输出: []

提示:

  • 二叉树的节点个数的范围是 [0,10^4]
  • -2^31 <= Node.val <= 2^31 - 1

题目思考

  1. 如何记录当前层的信息?

解决方案

思路

  • 分析题目, 需要找到每一层的最大值, 我们可以使用经典的按层 BFS 来解决, 具体思路如下:
    • 记录下当前层的节点边界
    • 然后当前层的子节点都加入队列后, 将队列更新为从下一层节点起点开始
    • 这样就确保每一层都单独被记下来了
  • 具体实现细节如下:
    • 使用一个队列存储节点
    • 接下来开始循环, 记录当前队列长度 curlen
    • 然后遍历前 curlen 个节点, 统计其中的最大值, 并将它们的左右非空子节点追加到队列结尾
    • 当前层遍历结束时, 将最大值追加到最终结果中, 下层的起点下标自然就是 curlen, 所以只需要将队列切片成 curlen 及以后的部分即可
    • 最终当队列没有元素时则说明所有节点都遍历过了, 退出循环
  • 由于这里是树, 所以每个节点只可能被加入队列访问一次, 无需额外的 visit 集合
  • 下面的代码就对应了上面的整个过程, 并且有详细的注释, 方便大家理解

复杂度

  • 时间复杂度 O(N): 需要遍历每个节点一遍
  • 空间复杂度 O(N): 需要存储所有节点到对应的层

代码

class Solution:
    def largestValues(self, root: TreeNode) -> List[int]:
        # 按层BFS
        res = []
        if not root:
            # 没有节点, 返回空列表
            return res
        # 队列初始化为第一层, 即根节点
        q = [root]
        while q:
            # 记录当前层的节点个数curlen
            curlen = len(q)
            # 记录当前层最大值, 初始化为该层第一个节点的值
            mx = q[0].val
            # 只遍历当前层的节点, 即前curlen个
            for node in q[:curlen]:
                # 更新最大值
                mx = max(mx, node.val)
                # 左右子节点非空时, 将其追加到队列中
                if node.left:
                    q.append(node.left)
                if node.right:
                    q.append(node.right)
            # 将当前层最大值追加到最终结果中
            res.append(mx)
            # 将队列更新成下一层的节点
            q = q[curlen:]
        return res

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

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

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

相关文章

【JavaEE】多线程(二)

多线程&#xff08;二&#xff09; 文章目录 多线程&#xff08;二&#xff09;第一个多线程程序观察线程sleep创建线程继承Thread类&#xff0c;重写run方法实现Runnable&#xff0c; 重写run继承Thread&#xff0c;重写run实现Runnable&#xff0c;重写run基于lambda表达式 T…

ETL与ELT理解

ETL ETL&#xff08; Extract-Transform-Load&#xff09;&#xff0c;用来描述将数据从来源端经过抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;、加载&#xff08;Load&#xff09;至目的端的过程。ETL模式适用于小数据量集。如果在转换过程…

利用hutool工具类实现验证码功能

hutool工具类实现验证码 一.生成验证码二.校验验证码三.使用案例1.引入hutool工具类2.VerifyCodeResp接口响应体3.VerifyCodeController验证码工具类4.测试验证5.项目结构及源码下载 利用hutool工具类&#xff0c;可以很方便生成不同类型的验证码。这里简单记录下使用过程。 一…

1500*C. Tenzing and Balls (线性DP)

解析&#xff1a; 每次选择两个相同的数&#xff0c;删去他们以及他们之间的所有数&#xff0c;问最多可以删除多少&#xff1f; DP&#xff0c;对于某个位置 i &#xff0c;其前面有多个 j 使得 a[i]a[j]&#xff0c;所以使用 f[i] 来记录前 i 个数能够删除的最大值。 #inclu…

内网横向移动

内网横向移动 当攻击者在拿下一台内网主机后&#xff0c;通常会利用当前拿下的机器当作跳板&#xff0c;进一步攻击 内网其他主机&#xff0c;扩大攻击影响范围。 攻击机&#xff1a;Kali Linux 靶机&#xff1a; Windows server 2008 WEB 10.10.10.20…

C: . 与 -> 的区别

相同点&#xff1a; 功能相同&#xff1a;访问结构体或者类的成员。优先级相同。 不同点&#xff1a; 结构体变量用 . 来访问成员&#xff1b;结构体指针用 ->来访问成员&#xff1b; #include <stdio.h> #include<string.h> //首先定义结构体类型student&a…

达摩院SPACE对话大模型:预训练语言模型,预训练对话模型,知识注入

01 预训练语言模型 VS 预训练对话模型 1. 大规模语言模型 过去几年 NLP 领域的重大进展&#xff0c;主要是大型预训练模型出现与大规模使用。预训练语言模型有了很大的发展&#xff0c;出现了很多变种。但是&#xff0c;本质上都还是语言模型&#xff0c;如上图右边的流程图所…

练习-使用ApplicationContext中事件发送以及AOP来实现代码解耦

案例要求 将用户注册与用户发送消息之间进行解耦 实现 ApplicationContext接口 具体文章见&#xff1a;BeanFactory与ApplicationContext_熵240的博客-CSDN博客 创建事件类 package com.example;import org.springframework.context.ApplicationEvent;public class UserRegis…

回溯算法解决分割回文串

回溯算法解分割回文串 力扣131 给你一个字符串 s&#xff0c;请你将 s 分割成一些子串&#xff0c;使每个子串都是 回文串 。返回 s 所有可能的分割方案。 回文串 是正着读和反着读都一样的字符串。 示例 1&#xff1a; 输入&#xff1a;s "aab" 输出&#xff1…

婚恋相亲系统小程序源码金媒v10.0版 红娘系统pc端+h5端+公众好端统一后台管理模块

婚恋相亲系统小程序源码 金媒v10.0版本 红娘系统正版pc端+h5端+公众好端 统一后台管理 模块:vip模块,活动报名,红娘模块,上榜模块,婚恋文章,动态模块,红娘认领,认证模块(五种,有实名,手机,学历,收入,房子)等等。 多种模板 后台 管理员后台 红娘独立后台,…

Python 字符串格式化

视频版教程 Python3零基础7天入门实战视频教程 我们前面学到字符串拼接&#xff0c;如果简单的2,3个字符串拼接那还算好&#xff0c;如果大于3个变量的拼接&#xff0c;就比较麻烦。还有一点&#xff0c;就是字符串无法和和其他类型直接拼接&#xff0c;需要进行类型转换&…

地奥“畅依笙”革故鼎新,新品面市! 呵护肠胃 助力大健康!

根据平安健康发布的《2021国民肠道健康调研报告》&#xff0c;肠道问题逐渐年轻化&#xff0c;约90%的国人都会遇到肠道问题。我国肠胃终端产品持续热销&#xff0c;根据2021年淘宝天猫全年益生菌保健品/功能食品市场规模&#xff0c;销售额达63.2亿元&#xff1b;目前益生菌类…

Unity减少发布打包文件的体积——获取精灵图片的信息限制它的大小

一、起因 一个工程&#xff0c;打包成webGL且压缩成zip文件后&#xff0c;接近400M&#xff0c;后来把大的精灵图片设置最大尺寸&#xff0c;降低大小后&#xff0c;再次发布&#xff0c;zip文件缩减到250M 二、如何一键获得工程里面的精灵图片信息 三、获取精灵图片信息 1、…

智能工单系统的报修流程是怎样的?工单管理系统有什么作用?

“的修”智能工单管理系统适用于多个行业&#xff0c;包括学校、医院、酒店、企事业单位和社区物业。它基于微信小程序平台和APP开发&#xff0c;支持实现故障报修、报修状态查询以及服务评价等功能。用户可以轻松使用微信进行报修&#xff0c;以及查询报修的进度、状态和对服务…

【Linux从入门到精通】多线程 | 线程互斥(互斥锁)

上篇文章我们对线程 | 线程介绍&线程控制介绍后&#xff0c;本篇文章将会对多线程中的线程互斥与互斥锁的概念进行详解。同时结合实际例子解释了可重入与不被重入函数、临界资源与临界区和原子性的概念。希望本篇文章会对你有所帮助。 文章目录 引入 一、重入与临界 1、1 可…

网络安全深入学习第一课——热门框架漏洞(RCE-命令执行)

文章目录 一、RCE二、命令执行/注入-概述三、命令执行-常见函数四、PHP命令执行-常见函数1、exec&#xff1a;2、system3、passthru4、shell_exec5、反引号 backquote 五、PHP命令执行-常见函数总结六、命令执行漏洞成因七、命令执行漏洞利用条件八、命令执行漏洞分类1、代码层…

目标检测评估指标mAP:从Precision,Recall,到AP50-95【未完待续】

1. TP, FP, FN, TN True Positive 满足以下三个条件被看做是TP 1. 置信度大于阈值&#xff08;类别有阈值&#xff0c;IoU判断这个bouding box是否合适也有阈值&#xff09; 2. 预测类型与标签类型相匹配&#xff08;类别预测对了&#xff09; 3. 预测的Bouding Box和Ground …

C高级day5(Makefile)

一、Xmind整理&#xff1a; 二、上课笔记整理&#xff1a; 1.#----->把带参宏的参数替换成字符串 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX(a,b) a>b?a:b #define STR(n) #n int main(int argc, const char *argv…

sheetjs實現頁面的數據導出execl

概述 需要給頁面的table做一個數據導出功能,發現一個好用sheetjs工具 只需要簡單的js語法如下,就可以將table的數據導出來 function load(){var date new Date();date.setTime(date.getTime() (8 * 60 * 60 * 1000));var table document.getElementById("tab");v…

神领物流 day02-网关与支付 Spring Cloud Alibaba 微服务

课程安排 单token存在的问题双token三验证用户端token校验与鉴权对接三方支付平台分布式锁 1、场景说明 新入职的你加入了开发一组&#xff0c;也接到了开发任务&#xff0c;并且你也顺利的修复了bug&#xff0c;完成了快递员、司机的鉴权&#xff0c;现在的你已经对项目的业…