棧與隊列leetcode題型總結

1. 常用表格總結

數據結構常見應用場景時間復雜度(入/出/查)LeetCode 高頻題
棧(Stack)括號匹配、單調棧、DFS入棧 O(1) / 出棧 O(1) / 查頂 O(1)20 有效的括號, 155 最小棧, 739 每日溫度
隊列(Queue)層序遍歷、BFS、滑動窗口入隊 O(1) / 出隊 O(1) / 查頭 O(1)225 用隊列實現棧, 102 二叉樹層序遍歷, 239 滑動窗口最大值
雙端隊列(Deque)單調隊列、滑動窗口前后插入 O(1) / 前后刪除 O(1)641 設計雙端隊列, 239 滑動窗口最大值
優先隊列(Heap)最大/最小值快速獲取插入 O(log n) / 刪除 O(log n) / 取堆頂 O(1)23 合并K個有序鏈表, 347 前 K 個高頻元素

2. 常用解題思路

  • 棧(Stack)

    • 括號匹配類:遇到左括號入棧,遇到右括號檢查棧頂

    • 單調棧:維護單調遞增/遞減棧,用于“下一個更大/更小元素”

    • 模擬函數調用:遞歸展開或表達式求值

  • // 棧常見寫法
    Stack<Integer> stack = new Stack<>();// 入棧
    stack.push(x);// 出棧
    int val = stack.pop();// 查看棧頂
    int top = stack.peek();// 判空
    if(stack.isEmpty()) { ... }
    

  • 隊列(Queue)

    • BFS:樹/圖最短路徑,逐層擴展

    • 層序遍歷:樹按層輸出

    • 循環隊列:利用數組實現環形結構

  • // 普通隊列
    Queue<Integer> queue = new LinkedList<>();// 入隊
    queue.offer(x);// 出隊
    int val = queue.poll();// 查看隊頭
    int head = queue.peek();// 判空
    if(queue.isEmpty()) { ... }
    
  • 雙端隊列(Deque)

    • 單調隊列:保證隊首是最大/最小值,常用于滑動窗口問題

    • 雙向擴展搜索(BFS 優化)

  • 優先隊列(Heap)

    • 維護動態區間的最大/最小值

    • 經典應用:前 K 個最大值,合并 K 個有序列表

3. 常見注意點

  • 棧模擬遞歸時要注意 棧溢出 問題

  • 隊列的 BFS 中要注意 訪問過的節點要標記(避免死循環)

  • 單調棧/隊列需要 合理出棧/出隊 保證單調性

  • 循環隊列數組實現時下標要用 取模運算

4. 高頻模板

棧:括號匹配(LC 20)

public boolean isValid(String s) {Stack<Character> stack = new Stack<>();for (char c : s.toCharArray()) {if (c == '(') stack.push(')');else if (c == '[') stack.push(']');else if (c == '{') stack.push('}');else if (stack.isEmpty() || stack.pop() != c) return false;}return stack.isEmpty();
}

單調棧:下一個更大元素(LC 496/739)

Stack<Integer> st = new Stack<>();
for (int i = n - 1; i >= 0; i--) {while (!st.isEmpty() && st.peek() <= nums[i]) st.pop();ans[i] = st.isEmpty() ? -1 : st.peek();st.push(nums[i]);
}

隊列:BFS 層序遍歷(LC 102)

Queue<TreeNode> q = new LinkedList<>();
q.offer(root);
while (!q.isEmpty()) {int size = q.size();List<Integer> level = new ArrayList<>();for (int i = 0; i < size; i++) {TreeNode node = q.poll();level.add(node.val);if (node.left != null) q.offer(node.left);if (node.right != null) q.offer(node.right);}ans.add(level);
}

單調隊列:滑動窗口最大值(LC 239)

Deque<Integer> dq = new ArrayDeque<>();
for (int i = 0; i < n; i++) {if (!dq.isEmpty() && dq.peekFirst() <= i - k) dq.pollFirst();while (!dq.isEmpty() && nums[dq.peekLast()] <= nums[i]) dq.pollLast();dq.offerLast(i);if (i >= k - 1) ans[i - k + 1] = nums[dq.peekFirst()];
}

5 leetcode題目

232用棧實現隊列

class MyQueue {private Stack<Integer> inStack;private Stack<Integer> outStack;public MyQueue() {inStack = new Stack<>();outStack = new Stack<>();}  public void push(int x) {inStack.push(x);}public int pop() {shiftStack();return outStack.pop();}public int peek() {shiftStack();return outStack.peek();}public boolean empty() {return inStack.isEmpty() && outStack.isEmpty();}private void  shiftStack(){if(outStack.isEmpty()){while(!inStack.isEmpty()){outStack.push(inStack.pop());}}}
}/*** Your MyQueue object will be instantiated and called as such:* MyQueue obj = new MyQueue();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.peek();* boolean param_4 = obj.empty();*/

225用隊列實現棧

class MyStack {private Queue<Integer> queue1;private Queue<Integer> queue2;public MyStack() {queue1 = new LinkedList<>();queue2 = new LinkedList<>();}public void push(int x) {queue2.offer(x); //暫時while(!queue1.isEmpty()){queue2.offer(queue1.poll());}Queue<Integer> temp = queue1;queue1 = queue2;queue2 = temp;}public int pop() {return queue1.poll();}public int top() {return queue1.peek();}public boolean empty() {return queue1.isEmpty();}
}/*** Your MyStack object will be instantiated and called as such:* MyStack obj = new MyStack();* obj.push(x);* int param_2 = obj.pop();* int param_3 = obj.top();* boolean param_4 = obj.empty();*/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/93632.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/93632.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/93632.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

云原生俱樂部-RH124知識點總結(3)

寫到這RH124的內容已經過半了&#xff0c;雖然內容不多&#xff0c;但是還是不太好寫。因為簡單的命令不想寫&#xff0c;至于理解上也沒什么難度&#xff0c;不過還是要保證整體內容的都要講到。這篇文章就把RH124剩下的內容都完結吧&#xff0c;主要還剩下配置和保護SSH、管理…

安裝DDNS-go

wget https://github.com/jeessy2/ddns-go/releases/download/v6.12.2/ddns-go_6.12.2_linux_x86_64.tar.gz tar zxvf ddns-go_6.12.2_linux_x86_64.tar.gz sudo ./ddns-go -s install

機器學習深度學習 所需數據的清洗實戰案例 (結構清晰、萬字解析、完整代碼)包括機器學習方法預測缺失值的實踐

礦物數據.xls礦物種類&#xff1a;A&#xff0c;B&#xff0c;C&#xff0c;D&#xff0c;E&#xff08;其中E數據只有一條&#xff0c;無法用于訓練&#xff0c;直接剔除&#xff09;特征&#xff1a;序號 氯 鈉 鎂 硫 鈣 鉀 碳 溴 鍶 pH 硼 氟 硒 礦物類型此數據有&#xff1…

從基礎到架構的六層知識體系

第1層&#xff1a;數學與邏輯基礎&#xff08;The Foundation&#xff09;&#x1f4cc; 計算機技術的根源&#xff1b;為算法分析、密碼學、AI等提供理論支撐離散數學&#xff1a;集合、圖論、邏輯、遞歸線性代數&#xff1a;機器學習、圖形學基礎概率與統計&#xff1a;數據分…

Flask 路由與視圖函數綁定機制

Flask 路由與視圖函數綁定機制 核心概念 在 Flask 框架中&#xff0c;路由&#xff08;Route&#xff09; 是連接 URL 路徑與 Python 函數的橋梁&#xff0c;通過 app.route() 裝飾器實現這種綁定關系&#xff0c;使得當用戶訪問特定 URL 時&#xff0c;對應的函數會被自動調用…

Spring 的 setter 注入可以解決某些類型的循環依賴問題

參考&#xff1a;https://blog.csdn.net/weixin_50055999/article/details/147493914?utm_sourceminiapp_weixin Setter 方法注入 (Setter Injection) 在類中提供一個 setter 方法&#xff0c;并在該方法上使用 Autowired、Resource 等注解。 代碼示例 import org.springfr…

數據結構代碼分享-5 鏈式棧

linkstack.c#include<stdio.h> #include<stdlib.h> #include"linkstack.h" //1.創建一個空的棧 void CreateEpLinkStack(linkstack_t **ptop) {*ptop NULL; } //2.入棧,ptop是傳入的棧針的地址&#xff0c;data是入棧的數據 int pushLinkStack(linkstac…

數學建模Topsis法筆記

評價決策類-Topsis法學習筆記 問題的提出 生活中我們常常要進行評價&#xff0c;上一篇中的層次分析法&#xff0c;通過確定各指標的權重&#xff0c;來進行打分&#xff0c;但層次分析法決策層不能太多&#xff0c;而且構造判斷矩陣相對主觀。那有沒有別的方法呢&#xff1f…

石英加速度計為何成為行業標桿?

在石油鉆井、航空航天、工業自動化等領域&#xff0c;高精度、高可靠性的加速度測量至關重要。ER-QA-03F系列石英撓性加速度計憑借其卓越的性能和穩定的表現&#xff0c;成為靜態與動態測試的理想選擇。自2012年推出以來&#xff0c;該產品已交付數千臺&#xff0c;并在石油鉆井…

HP Pavilion G6 筆記本使用ventoy啟動安裝Ubuntu 22.04 桌面版

HP Pavilion G6 筆記本是很老的筆記本了&#xff0c;淘到一款&#xff0c;成色比較新&#xff0c;使用i5 3210 M cpu &#xff0c;內存是2G*2&#xff0c;正好手邊有一條4G內存條&#xff0c;替換一條后擴充為6G內存&#xff0c;感覺可以再戰10年&#xff01;&#xff08;當然6…

STM32G4 Park及反Park變換(二)實驗

目錄 一、STM32G4 Park及反Park變換(二)實驗 1 Park及反Park變換 1.1 代碼 1.2 上位機實驗結果 附學習參考網址 歡迎大家有問題評論交流 (* ^ ω ^) 一、STM32G4 Park及反Park變換(二)實驗 1 Park及反Park變換 本文介紹了基于STM32G4的Park及反Park變換實驗過程。主要內容…

pgsql 如何查詢今天范圍內的數據(當天0點0分0秒 - 當天23點59分59秒....)

使用 CURRENT_DATE 函數CURRENT_DATE 返回當前日期&#xff08;不含時間部分&#xff09;。當它在查詢中與 timestamp 字段比較時&#xff0c;會自動被視為當天的開始&#xff0c;即 YYYY-MM-DD 00:00:00。CURRENT_DATE INTERVAL 1 day 計算出第二天的開始時間&#xff0c;即 …

DRM驅動架構淺析-上(DRM基礎概要與U-Boot階段驅動解析)

一、背景 近期項目吃緊&#xff0c;接了不少調屏相關的需求&#xff0c;期間磕磕絆絆&#xff0c;但總算完成要求。回首過往&#xff0c;調試過多種屏幕&#xff0c;包括LVDS、EDP、MIPI、MI轉EDP或是轉LVDS、DP以及HDMI等常見屏。在Rockchip平臺調外設也有段時間矣&#xff0…

idea中如何設置文件的編碼格式

目錄 一、全局與項目編碼配置 二、新項目預配置 一、全局與項目編碼配置 File --> Settings --> Editor --> File Encodings Global Encoding&#xff1a;設置為UTF-8&#xff0c;影響IDE界面及新建文件的默認編碼。??Project Encoding&#xff1a;選擇UTF-8&am…

2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(六)

本文主要回顧2025年上半年(2025-5-24)系統架構設計師考試上午綜合知識科目的選擇題,同時附帶參考答案、解析和所涉知識點。 2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(一) 2025年5月架構設計師綜合知識真題回顧,附參考答案、解析及所涉知識點(…

Ubuntu22系統上源碼部署LLamaFactory+微調模型 教程【親測成功】

0.LLamaFactory LLaMA-Factory 是一個開源的低代碼大模型訓練與微調框架&#xff0c;旨在簡化大規模語言模型&#xff08;LLM&#xff09;的微調、評估和部署流程&#xff0c;幫助開發者和研究人員更高效地定制和優化模型。 1.安裝部署 1.1克隆倉庫 git clone --depth 1 ht…

打靶日常-sql注入(手工+sqlmap)

小知識: 注入點:在哪里輸入sgl指令中的參數 執行點:在那個頁面拼接sql指令并發送給數據庫執行 回顯點:執行的結果顯示在哪個頁面 sqlmap知識點: 輸出等級 -v3 范圍0-6 默認1 一般3 考試3 測試等級 --level=1 范圍…

繞過服務端文件上傳檢測:黑名單繞過技術與實戰

繞過服務端文件上傳檢測&#xff1a;黑名單繞過技術與實戰文件上傳漏洞是Web安全中常見且危害極大的漏洞類型之一&#xff0c;而黑名單機制是最基礎的防御手段。本文將深入探討三種經典的黑名單繞過技術&#xff0c;并提供實戰案例與防御方案。引言 文件上傳功能是現代Web應用的…

在職老D滲透日記day21:sqli-labs靶場通關(第27a關)get聯合注入 過濾select和union “閉合

5.27a.第27a關 get聯合注入 過濾select和union "閉合function blacklist($id) { $id preg_replace(/[\/\*]/,"", $id); //strip out /* $id preg_replace(/[--]/,"", $id); //Strip out --. $id preg_replace(/[#]/,"", $id); //Strip …

Git#cherry-pick

場景 項目里有多個分支&#xff0c;在某個分支commit內容想要應用到當前分支 命令 git cherry-pick --helpgit cherry-pick commit-ish&#xff1a;某個其他分支的commit應用到當前所在分支 (默認自動提交)git cherry-pick -n commit-ish&#xff1a;–no-commit(不自動提交)&a…