LeetCode算法日记 - Day 37: 验证栈序列、N叉树的层序遍历

目录

1. 验证栈序列

1.1 题目解析

1.2 解法

1.3 代码实现

2. N叉树的层序遍历

2.1 题目解析

2.2 解法

2.3 代码实现


1. 验证栈序列

https://leetcode.cn/problems/validate-stack-sequences/description/

给定 pushed 和 popped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false 。

示例 1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例 2:

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

提示:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed 的所有元素 互不相同
  • popped.length == pushed.length
  • popped 是 pushed 的一个排列

1.1 题目解析

题目本质:
判断一对 pushed / popped 序列能否由同一“从空开始”的栈操作产生。抽象成:按 pushed 顺序“尽量入栈”,每当栈顶等于 popped 的下一个元素就立刻出栈,最终是否能把 popped 全部匹配并清空栈。

常规解法:
最直观就是模拟栈:顺序把 pushed[i] 入栈;每次入栈后,若栈顶恰好等于 popped[j],就持续出栈并前进 j。

问题分析:
该题无需复杂数据结构,也不需要回溯。因为所有元素互不相同,且 popped 是 pushed 的一个排列,所以“能弹就弹”的贪心策略不会错;若某个 popped[j] 迟迟在栈顶见不到,那就永远见不到(后续只会把更多不同元素压在它上面)。

思路转折:
要想高效 → 直接一次线性扫描 + 栈模拟即可:

  • 扫过 pushed 时入栈;

  • 每次入栈后,尽可能匹配 popped 进行弹栈;

  • 扫描结束后栈应为空(或 j == n)。
    时间 O(n),空间 O(n),是本题最优做法。

1.2 解法

算法思想:
维护指针 i 遍历 pushed、指针 j 指向 popped 的下一个待弹元素;循环中把 pushed[i] 入栈,然后在 stack.peek() == popped[j] 时不断 pop() 与 j++;最终栈空则返回 true。

i)初始化空栈,i = 0, j = 0。

ii)外层循环:当 i < pushed.length:

  • push(pushed[i]),i++;

  • 内层循环:当 stack.peek() == popped[j]:

    • pop(),j++。

iii)全部处理后,返回 stack.isEmpty()(或判断 j == popped.length)。

易错点:

  • 等于就弹,且要连续弹:入栈后别忘了用 while 连续匹配 popped[j],直到不等为止。

  • 边界与空栈判断:写 peek() 前要保证栈非空(示例代码里通过条件顺序或 isEmpty() 规避)。

  • 指针前进时机:i 只在入栈后前进;j 只在成功弹出后前进。

1.3 代码实现

class Solution {public boolean validateStackSequences(int[] pushed, int[] popped) {// 可用 Deque<Integer> stack = new ArrayDeque<>(); 更高效java.util.Stack<Integer> stack = new java.util.Stack<>();int i = 0, j = 0, n = pushed.length;while (i < n) {stack.push(pushed[i++]);                 // 先按 pushed 顺序入栈// 只要栈顶等于 popped[j],就连续弹出并推进 jwhile (!stack.isEmpty() && stack.peek() == popped[j]) {stack.pop();j++;}}// 若能完全匹配,栈应被清空(等价于 j == n)return stack.isEmpty();}
}

复杂度分析:

  • 时间复杂度:O(n)。每个元素最多入栈一次、出栈一次。

  • 空间复杂度:O(n)。最坏情况下栈会临时存放尚未匹配的元素。

2. N叉树的层序遍历

https://leetcode.cn/problems/n-ary-tree-level-order-traversal/description/

给定一个 N 叉树,返回其节点值的层序遍历。(即从左到右,逐层遍历)。

树的序列化输入是用层序遍历,每组子节点都由 null 值分隔(参见示例)。

示例 1:

输入:root = [1,null,3,2,4,null,5,6]
输出:[[1],[3,2,4],[5,6]]

示例 2:

输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[[1],[2,3,4,5],[6,7,8,9,10],[11,12,13],[14]]

提示:

  • 树的高度不会超过 1000
  • 树的节点总数在 [0, 104] 之间

2.1 题目解析

题目本质:
在一棵 N 叉树上做层序遍历(Level Order Traversal):从根开始,逐层、从左到右收集结点值,形成二维列表。

常规解法:
队列做 BFS。根结点先入队;每一轮“锁定当前层的队列大小 sz”,弹出 sz 个结点,把它们的值放到当前层列表,并把它们的子结点(若非空)全部入队;层结束后把该层列表放进答案。。

问题分析:

  • 本题没有回溯或复杂剪枝,关键只是正确分层子结点判空

  • 题目上限:节点数 ≤ 1e4、树高 ≤ 1000。BFS 时间 O(n)、空间 O(w)(w 为最大宽度)都可接受。

  • DFS 也能做层序(记录 depth),但极深树形递归层数会接近 1000,BFS 更稳妥。

思路转折:
要想写得又对又稳 → 一次线性 BFS + 锁层大小

  • 入队根;

  • 循环直到队空:先记 sz = q.size(),弹 sz 次组成一层;

  • 遍历子结点时判空,避免 NullPointerException 与把 null 入队。

2.2 解法

算法思想:
维护队列 q。
1)若 root == null 直接返回空结果;
2)root 入队;
3)当队列非空,令 sz = q.size():循环 sz 次,弹出结点 node,把 node.val 记入本层;若 node.children != null,则将非空子结点依次入队;
4)把本层列表加入答案。重复直至队空。

步骤:

i)处理空树:返回 []。

ii)初始化:Queue<Node> q = new ArrayDeque<>(); q.offer(root);

iii)外层循环:while (!q.isEmpty()):

  • int sz = q.size(); List<Integer> level = new ArrayList<>(sz);

  • 重复 sz 次:

    • Node node = q.poll(); level.add(node.val);

    • 若 node.children != null:遍历每个子结点 ch,if (ch != null) q.offer(ch);

  • result.add(level);

iiii)返回 result。

易错点:

  • children 判空:node.children 可能为 null,遍历前要判空。

  • 不要入队 null:遍历子结点时 if (ch != null) 再 offer。

  • 锁层大小:务必先取 sz = q.size(),再弹 sz 次,防止跨层污染。

  • API 使用:队列用 offer/poll/peek,不要用 pop(那是栈/双端队列当栈用的)。

  • 实现类选择:Queue 不能 new Queue<>();用 ArrayDeque<>(相对 LinkedList 更高效、足够)。

  • 空树返回值:不要返回 null,而是空列表。

  • 泛型简写:new ArrayList<>()、new ArrayDeque<>() 更简洁。

2.3 代码实现

/*
// Definition for a Node.
class Node {public int val;public List<Node> children;public Node() {}public Node(int _val) { val = _val; }public Node(int _val, List<Node> _children) {val = _val; children = _children;}
};
*/import java.util.*;class Solution {public List<List<Integer>> levelOrder(Node root) {List<List<Integer>> result = new ArrayList<>();if (root == null) return result;  // 空树Queue<Node> q = new ArrayDeque<>();q.offer(root);while (!q.isEmpty()) {int sz = q.size();                   // 锁定本层大小List<Integer> level = new ArrayList<>(sz);for (int i = 0; i < sz; i++) {Node node = q.poll();            // 出队当前层结点level.add(node.val);if (node.children != null) {     // 判空再遍历子结点for (Node ch : node.children) {if (ch != null) q.offer(ch);}}}result.add(level);                   // 收录本层}return result;}
}

复杂度分析:

  • 时间复杂度:O(n),每个结点至多入队/出队一次。

  • 空间复杂度:O(w),其中 w 为树在某一层的最大结点数(最坏 O(n))。

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

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

相关文章

金融数据库--3Baostock

一、 Baostock 是什么&#xff1f;Baostock&#xff08;宝硕股票&#xff09;是一个免费、开源的证券数据平台&#xff08;SDK&#xff09;&#xff0c;旨在为金融量化投资者、研究人员和学生提供稳定、准确、易用的A股历史数据和相关金融数据。其核心是一个 Python 库&#xf…

微信小程序-1-微信开发者工具环境搭建和初始化创建项目

文章目录1 小程序概述1.1 什么是微信小程序1.2 大前端概念1.3 账号注册1.4 开发流程1.5 小程序成员2 创建项目2.1 创建项目流程2.2 创建项目2.3 本地开发支持http3 项目目录3.1 项目目录结构3.2 配置文件3.2.1 app.json(全局配置)3.2.2 xxx.json(页面配置)3.2.3 project.config…

Go语言开发AI应用

为什么选择Go语言开发AI应用在人工智能快速发展的今天&#xff0c;选择合适的编程语言对于AI应用的成功至关重要。虽然Python长期以来被认为是AI开发的首选语言&#xff0c;但Go语言正在逐渐崭露头角&#xff0c;成为AI应用开发的有力竞争者。Go语言的核心优势1. 卓越的性能表现…

10. 游戏开发中的TCP与UDP

1.TCP和UDP 2.TCP为什么慢于UDP 3.可靠UDP1.TCP和UDP 1).通过打电话的方式说明TCP和UDPa.TCP(传输控制协议), 就像打电话- 需要先拨号, 接通, 问候(建立连接)- 你一句, 我一句, 对方没有听清会要求你重复(确认与重传)- 保证对话有条不紊, 内容准确无误(可靠, 有序)- 如果信号不…

CMap常用函数

CMap 是 MFC 中用于存储键值对&#xff08;key-value&#xff09;的关联容器类&#xff0c;类似于 C 标准库中的 std::map&#xff0c;但依赖 MFC 框架实现。它采用哈希表&#xff08;Hash Table&#xff09;作为底层数据结构&#xff0c;支持高效的键值查找、插入和删除操作。…

Rocky9.0去堆叠双发arp(支持“ARP 广播双发”)

摘要 在去堆叠/MLAG 场景下&#xff0c;默认 bonding 只会以单口回复 ARP&#xff0c;另一台交换机收不到 ARP Reply。本文在 Linux bonding 驱动中增加参数 arp_broadcast_mode&#xff0c;当开启时对 ARP 包临时切换到 广播模式&#xff0c;实现双口同时发 ARP Reply。文内提…

网页连接摄像头

摄像机处理 <!-- camera_solve.html --> <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>…

FPGA雷达信号处理之:自适应门限阈值

一、原理 参考这个博主&#xff0c;讲的很仔细&#xff1a;基于脉冲功率的雷达脉冲参数检测原理详解 二、FPGA实现 使用system generator搭建算法模型如下&#xff1a; 在这里&#xff0c;滤波器窗长度为8&#xff0c;原博主设置为50效果更好&#xff0c;门限公式如下&#xf…

Vue 中实现选中文本弹出弹窗的完整指南

在现代 Web 应用中&#xff0c;选中文本后显示相关操作或信息是一种常见的交互模式。本文将详细介绍如何在 Vue 中实现选中文本后弹出弹窗的功能&#xff0c;包括其工作原理、多种实现方式以及实际项目中的应用示例。 一、实现原理 1. 文本选中检测机制 浏览器提供了 Select…

第4节-排序和限制-FETCH

摘要: 在本教程中&#xff0c;你将学习如何使用 PostgreSQL 的 FETCH 子句从查询中检索部分行。 PostgreSQL FETCH 简介 在 PostgreSQL 中&#xff0c;OFFSET 子句的作用类似于 LIMIT 子句。FETCH 子句允许你限制查询返回的行数。 LIMIT 子句并非 SQL 标准的一部分。不过&#…

洛谷 P2680 [NOIP 2015 提高组] 运输计划(二分答案 + 树上差分)

题目链接题目概括与评价 很经典&#xff0c;突破口藏的很深&#xff0c;求最小值这里&#xff0c;是问题切入点&#xff0c;想到用二分答案&#xff0c;然后思考怎么写 f_check 函数。二分答案树上差分。代码 #include <iostream> #include <vector> #include <…

接力邓承浩,姜海荣能讲好深蓝汽车新故事吗?

出品 | 何玺排版 | 叶媛深蓝汽车迎来新话事人。9月5日&#xff0c;新央企长安汽车旗下品牌深蓝汽车传出新的人事调整。多家业内媒体报道称&#xff0c;荣耀前中国区CMO姜海荣已正式加入长安汽车&#xff0c;并出任旗下深蓝汽车CEO一职。原CEO邓承浩则升任深蓝汽车董事长&#x…

esp32-c3写一个收集附近 WiFi 和蓝牙信号通过

下面给你一个基于 ESP-IDF(v5.x) 的完整示例&#xff1a;在 ESP32-C3 上同时扫描附近 Wi-Fi 与蓝牙&#xff08;BLE&#xff09;广播&#xff0c;把结果以 JSON 结构统一输出到串口&#xff0c;并且可可选通过 MQTT 上报到服务器&#xff08;打开一个宏即可&#xff09;。日志默…

文心大模型 X1.1:百度交出的“新深度思考”答卷

文心大模型 X1.1&#xff1a;百度交出的“新深度思考”答卷 2025年9月9日&#xff0c;WAVE SUMMIT 2025深度学习开发者大会在北京正式召开&#xff0c;由深度学习技术及应用国家工程研究中心主办&#xff0c;百度飞桨与文心大模型联合承办。大会上&#xff0c;百度正式发布了基…

开始 ComfyUI 的 AI 绘图之旅-Flux.1图生图(八)

文章标题一、Flux Kontext Dev1.关于 FLUX.1 Kontext Dev1.1 版本说明1.2 工作流说明1.3 模型下载2.Flux.1 Kontext Dev 工作流2.1 工作流及输入图片下载2.2 按步骤完成工作流的运行3.Flux Kontext 提示词技巧3.1 基础修改3.2 风格转换3.3 角色一致性3.4 文本编辑4.常见问题解决…

Java 生成微信小程序二维码

1. java 二维码生成工具类import cn.hutool.core.util.StrUtil; import cn.hutool.json.JSONObject; import com.pdatao.api.controller.file.FileController; import com.pdatao.api.error.CommunityException; import org.apache.commons.io.IOUtils; import org.springframe…

智慧健康触手可及:AI健康小屋——未来健康管理的全能守护者

AI健康小屋&#xff0c;这座融合人工智能、物联网与医疗科技的“健康堡垒”&#xff0c;正悄然重构健康管理生态。它以科技为引擎&#xff0c;将专业医疗资源下沉至社区、企业、家庭&#xff0c;通过智能检测、精准分析、个性化干预&#xff0c;实现从疾病治疗到主动预防的健康…

[工作表控件19] 验证规则实战:如何用正则表达式规范业务输入?

在企业应用中,数据准确性至关重要。工作表控件通过“验证规则”能力,支持在文本字段和附件字段中使用正则表达式(RegEx)进行格式校验。它能帮助开发者轻松实现邮箱、身份证号、车牌号、URL 等格式的高效验证,大幅提升数据质量与表单使用体验。 一、官方功能介绍与基础能力…

uniapp分包实现

关于分包优化的说明 在对应平台的配置下添加"optimization":{"subPackages":true}开启分包优化 目前只支持mp-weixin、mp-qq、mp-baidu、mp-toutiao、mp-kuaishou的分包优化 分包优化具体逻辑&#xff1a; 静态文件&#xff1a;分包下支持 static 等静态…

ctfshow_web14------(PHP+switch case 穿透+SQL注入+文件读取)

题目&#xff1a;解释&#xff1a;$c intval($_GET[c]); //获取整数值 6sleep($c);//延迟执行当前脚本若干秒。提示一下哈没有break会接着执行下面的但是像是44444&#xff0c;555555,sleep的时间太久我们用3进入here_1s_your_f1ag.php是一个查询页面&#xff0c;sql注入查看源…