Leetcode Java學習記錄——棧和隊列 IDEA

文章目錄

  • 棧和隊列
    • stack Class
    • queue Interface
    • Deque Interface
      • add 和 push
    • Priority Queue -- Class
    • 題目
  • codestyle
  • IDEA 操作
    • 快捷鍵
      • 選擇
      • 代碼生成類

棧和隊列

stack Class

google stack java 8/12

empty()
peek()
pop()
push(E item)
search(Object o)

最近相關性會用到棧

queue Interface

  • Throws exception:
    add(e)
    remove()
    element()
  • Returns special value:
    offer()
    peek()
    poll()

大多滑動窗口的題目,用隊列解決即可。

Deque Interface

ArrayDeque,LinkedList…

API與queue類似,乘二。
分為First和Last。

add 和 push

當我們使用Deque實現棧的功能時,注意要用push(==addFirst)。不要寫成add(==addLast)

LinkedList實現的Deque,peek,pop,push都是在列表頭進行操作。

Priority Queue – Class

  1. 插入O(1)
  2. 取出O(lonN)- 按照元素的優先性
  3. 底層具體實現多樣,可以用heap堆、bst、treap

題目

  1. 有效的括號
class Solution {public boolean isValid(String s) {Deque < Character > deque = new LinkedList<>();//注意實例化的寫法//用了char,后續都要用單引號,不能用雙引號Stringchar ch ;for ( int i = 0 ; i < s.length() ; i++ ){ch = s.charAt(i);//charAt的寫法if( ch == '('){deque.push(')');//這里deque是push,不是append。更不是add。}else if(ch == '['){deque.push(']');}else if(ch =='{' ){deque.push('}');}//下面一行搞錯了,如果過程中deque就空了,也要返回false。所以不能是且,是或//else if(deque.isEmpty()!=false && ch != deque.peek()){else if(deque.isEmpty() || ch != deque.peek()){return false;}else{deque.pop();}}return deque.isEmpty();}
}
  1. 最小棧

設計一個支持 push ,pop ,top 操作,并能在常數時間內檢索到最小元素的棧。

實現 MinStack 類:

MinStack() 初始化堆棧對象。
void push(int val) 將元素val推入堆棧。
void pop() 刪除堆棧頂部的元素。
int top() 獲取堆棧頂部的元素。
int getMin() 獲取堆棧中的最小元素。

class MinStack {// 兩個棧即可實現private Stack<Integer> stack;private Stack<Integer> min_stack;public MinStack() {stack = new Stack<>();min_stack = new Stack<>();}public void push(int val) {stack.push(val);if(min_stack.isEmpty() || val<=min_stack.peek() )min_stack.push(val);}public void pop() {if(stack.pop().equals(min_stack.peek()))min_stack.pop();}public int top() {return stack.peek();}public int getMin() {return min_stack.peek();}
}
  1. 柱狀圖中的最大矩形面積

給定非負整數數組 heights ,數組中的數字用來表示柱狀圖中各個柱子的高度。每個柱子彼此相鄰,且寬度為 1 。

求在該柱狀圖中,能夠勾勒出來的矩形的最大面積。

class Solution {public int largestRectangleArea(int[] heights) {//暴力:遍歷每一個,左右到比他更小就停,總結矩形面積。On方//單調棧Stack<Integer> stack = new Stack<>();stack.push(-1);int maxArea = 0;for(int i = 0 ; i <heights.length ; i ++){//每次有新元素就和棧頂比較大小,直到入棧。//棧頂大則pop,且計算pop的index對應的area//棧頂小則入棧,不用計算areawhile(stack.peek() != -1 && heights[stack.peek()] > heights[i]){int index = stack.pop() ;maxArea = Math.max( maxArea , heights[index] * (i-stack.peek()-1));}//千萬別忘了入棧stack.push(i);}while(stack.peek() != -1){int index = stack.pop() ;//錯誤寫法,計算錯誤//maxArea = Math.max( maxArea , heights[index] * (index-stack.peek()-1));maxArea = Math.max( maxArea , heights[index] * (heights.length-stack.peek()-1));}return maxArea;}
}

優化方法: 單調棧
每一個點要有左右邊界。
為了找邊界,可以用棧。

維護一個棧,棧里元素從小到大排列。
(實際上可以是棧里放index,隨時可以查到對應的height,height才是從小到大排列)

向右走一位,進行至少一次判斷。

發現新高度小于棧頂,則說明有一個右邊界可以確定。

而左邊界一直是棧里該元素的下面一位(下一位是他左邊剛好比他小的那一個)的下標。

Area=(right- left -1)*index;

pop之后繼續判斷,若新高度小于棧頂,重復上述過程。直到新高度大于棧頂高度,新高度入棧。

棧底用 -1
則left = (-1)時公式不變,邊界處理一致。

class Solution {public int largestRectangleArea(int[] heights) {//暴力:遍歷每一個,左右到比他更小就停,總結矩形面積。On方//單調棧Stack<Integer> stack = new Stack<>();stack.push(-1);int maxArea = 0;for(int i = 0 ; i <heights.length ; i ++){//每次有新元素就和棧頂比較大小,直到入棧。//棧頂大則pop,且計算pop的index對應的area//棧頂小則入棧,不用計算areawhile(stack.peek() != -1 && heights[stack.peek()] > heights[i]){maxArea = Math.max( maxArea , heights[stack.pop()] * (i-stack.peek()-1));}//千萬別忘了入棧stack.push(i);}while(stack.peek() != -1){//錯誤寫法,計算錯誤//maxArea = Math.max( maxArea , heights[index] * (index-stack.peek()-1));maxArea = Math.max( maxArea , heights[stack.pop()] * (heights.length-stack.peek()-1));}return maxArea;}
}

codestyle

每一個括號和運算符前后都應該加空格。

IDEA 操作

快捷鍵

Home End鍵——行頭行尾
刪除行 ctrl + Y

選擇

擴選 ctrl + W
縮選 ctrl + Shift + W

代碼生成類

Alt+Insert:在目錄中使用該快捷鍵可以新建包,文件,類。在 java 文件中可以進行 setter,getter,構造方法,toString等方法生成,生成方法覆蓋(重寫)。
Ctrl+Shift+空格:智能代碼提示,代碼自動補全。可用于強制類型轉換補全,new 對象補全,return 補全等。
Ctrl+Shift+Enter:自動補全代碼結構。自動生成 if, do-while, try-catch, return(或方法調用) 語法正確的代碼結構,比如添加括號和大括號。

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

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

相關文章

湘潭大學軟件工程數據庫總結

文章目錄 前言試卷結構給學弟學妹的一些參考自己的一些總結 前言 自己可能很早很早之前就準備復習了&#xff0c;但是感覺還是沒有學到要點&#xff0c;主要還是沒啥緊迫的壓力&#xff0c;我們是三月份開學&#xff0c;那時候實驗室有朋友挺認真開始學習數據庫了&#xff0c;…

理性決策的藝術:從購房到擇偶的數學智慧;37% 規則,做出最佳決策的秘訣;用數學模型解決人生難題

在面對人生重大決策時&#xff0c;如購房或擇偶&#xff0c;我們常常感到迷茫和困惑。然而&#xff0c;如果我們能夠將這些看似復雜的問題簡化為數學模型&#xff0c;我們就能以更加理性和系統的方式做出決策。 37%規則 1950年代&#xff0c;當時幾位數學家開始研究這樣一個問…

值得收藏!盤點那些適合普通人方便又好用的AIGC工具!(下)

【導讀】接上一篇文章&#xff0c;盤點國內外適合普通人能夠輕松上手的AIGC工具&#xff08;上&#xff09;。今天又為大家整理了一些好用又方便的AI設計工具、AI辦公工具、AI編程工具、AI指令工具和AI檢測工具&#xff0c;如果有沒更新到的工具也歡迎大家評論區交流。 一 、A…

Kafka 入門指南

Kafka 入門指南 簡介 Kafka 是一個由 Apache 軟件基金會開發的開源流處理平臺。它最初由 LinkedIn 開發&#xff0c;并在 2011 年作為開源項目發布。Kafka 是一個分布式、可擴展、高吞吐量的消息隊列系統&#xff0c;廣泛應用于實時數據流處理場景。 主要概念 1. 主題 (Top…

C#/WPF 自制截圖工具

在日常使用電腦辦公時&#xff0c;我們經常遇到需要截圖然后保存圖片&#xff0c;我們往往需要借助安裝截圖工具才能實現&#xff0c;現在我們通過C#自制截圖工具&#xff0c;也能夠輕松進行截圖。 我們可以通過C#調用WindousAPI來實現截圖&#xff0c;實例代碼如下&#xff1a…

AI基本概念(人工智能、機器學習、深度學習)

人工智能 、 機器學習、 深度學習的概念和關系 人工智能 &#xff08;Artificial Intelligence&#xff09;AI- 機器展現出人類智慧機器學習 &#xff08;Machine Learning) ML, 達到人工智能的方法深度學習 &#xff08;Deep Learning&#xff09;DL,執行機器學習的技術 從范圍…

算法 —— 滑動窗口

目錄 長度最小的子數組 無重復字符的最長子串 最大連續1的個數 將x減到0的最小操作數 找到字符串中所有字母異位詞 長度最小的子數組 sum比target小就進窗口&#xff0c;sum比target大就出窗口&#xff0c;由于數組是正數&#xff0c;所以相加會使sum變大&#xff0c;相減…

關于redis的運維面試題-1

1. 什么是Redis&#xff1f; Redis&#xff08;Remote Dictionary Server&#xff09;是一個開源的內存數據結構存儲&#xff0c;通常用作數據庫、緩存和消息代理。它支持多種數據結構&#xff0c;如字符串&#xff08;strings&#xff09;、哈希&#xff08;hashes&#xff0…

大二暑假 + 大三上

希望&#xff0c;暑假能早睡早起&#xff0c;胸圍達到 95&#xff0c;腰圍保持 72&#xff0c;大臂 36&#xff0c;小臂 32&#xff0c;小腿 38&#x1f36d;&#x1f36d; 目錄 &#x1f348;暑假計劃 &#x1f339;每周進度 &#x1f923;寒假每日進度&#x1f602; &…

DiskGeniusV5.6.0.1565發布!

DiskGenius是一款功能強大的磁盤管理和數據恢復工具&#xff0c;V5.6.0.1565上線。新版本變化比較大&#xff0c;增加新的功能&#xff0c;修正已經問題&#xff0c;值得試一下。提醒大家&#xff0c;磁盤管理軟件涉及數據安全&#xff0c;請始終使用最新版本&#xff01; 下面…

JS hook

參照&#xff1a; JS 逆向之 Hook JS Hook 與 過 debugger 一、常用Hook 1. eval (function() {let _eval eval;eval function(val) {if (val.indexof(debugger) -1) {_eval_cache(obj);}} })(); 2. JSON.parse() (function () {var parse_ JSON.parse;JSON.parse …

C++ initializer_list類型推導

目錄 initializer_list C自動類型推斷 auto typeid decltype initializer_list<T> C支持統一初始化{ }&#xff0c;出現了一個新的類型initializer_list<T>&#xff0c;一切類型都可以用列表初始化。提供了一種更加靈活、安全和明確的方式來初始化對象。 class…

IO-Link OD介紹

IO-Link OD&#xff08;On-request Data&#xff0c;按需數據&#xff09;是IO-Link通信中的一種重要數據類型&#xff0c;主要用于參數讀寫、指令交互、事件上傳等動作。以下是關于IO-Link OD的結構、構成以及功能使用的詳細說明&#xff1a; 結構與構成 定義&#xff1a;OD…

堆排序(Heap Sort)

堆排序是一種高效的排序算法&#xff0c;它利用了堆的數據結構來實現。堆是一種特殊的完全二叉樹&#xff0c;分為最大堆和最小堆兩種類型。在最大堆中&#xff0c;父節點的值大于等于其子節點的值&#xff1b;而在最小堆中&#xff0c;父節點的值小于等于其子節點的值。 堆排…

【C命名規范】遵循良好的命名規范,提高代碼的可讀性、可維護性和可復用性

/******************************************************************** * brief param return author date version是代碼書寫的一種規范 * brief &#xff1a;簡介&#xff0c;簡單介紹函數作用 * param &#xff1a;介紹函數參數 * return&#xff1a;函數返回類型說明 * …

同一個excel表格,為什么在有的電腦上會顯示#NAME?

一、哪些情況會產生#NAME?的報錯 1.公式名稱拼寫錯誤 比如求和函數SUM&#xff0c;如果寫成SUN就會提示#NAME&#xff1f;報錯。 2.公式中的文本值未添加雙引號 如下圖&#xff1a; VLOOKUP(丙,A:B,2,0) 公式的計算結果會返回錯誤值#NAME?&#xff0c;這是因為公式中文本…

【PLC】三菱PLC如何和匯川伺服實現485通信

前言 一開始選用的是匯川SV660P脈沖型伺服&#xff0c;由于生產需求需要對伺服的個別參數進行讀取和寫入操作&#xff0c;但是SV660P并不支持這種情況&#xff0c;因此需要使用485通信來滿足。PLC這邊選用的是三菱FX5U。 開始 1、首先準備按照下圖的引腳提示準備好一根帶屏蔽…

全志H616交叉編譯工具鏈的安裝與使用

交叉編譯的概念 1. 什么是交叉編譯&#xff1f; 交叉編譯是指在一個平臺上生成可以在另一個平臺上運行的可執行代碼。例如&#xff0c;在Ubuntu Linux上編寫代碼&#xff0c;并編譯生成可在Orange Pi Zero2上運行的可執行文件。這個過程是通過使用一個專門的交叉編譯工具鏈來…

(七)glDrawArry繪制

幾何數據&#xff1a;vao和vbo 材質程序&#xff1a;vs和fs(頂點著色器和片元著色器) 接下來只需要告訴GPU&#xff0c;使用幾何數據和材質程序來進行繪制。 #include <glad/glad.h>//glad必須在glfw頭文件之前包含 #include <GLFW/glfw3.h> #include <iostrea…

程序員接單服務話術

進入群聊開始服務時&#xff1a; 尊敬的客戶您好&#xff0c;我程序員&#xff1a;xx 很榮幸為您服務 我擅長xx領域 接下來我們一起對接下詳細需求&#xff0c;我將根據您的任務需求難度給您匯報開發所需時長及報價。預祝我們合作愉快。 報價后且客戶接受時&#xff1a; 您好…