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
英文地址,請注明出處:http://en.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注入查看源…