1. 有效的括號
給定一個只包括 '(',')','{'表制,'}'濒生,'['埋泵,']' 的字符串 s ,判斷字符串是否有效罪治。
有效字符串需滿足:
左括號必須用相同類型的右括號閉合丽声。
左括號必須以正確的順序閉合。
解題思路:
- 使用 「椌跻澹」成對匹配括號
- 最終棧中還有未出棧的字符則代表非對稱
2. 最小棧
設(shè)計一個支持 push 雁社,pop ,top 操作晒骇,并能在常數(shù)時間內(nèi)檢索到最小元素的棧霉撵。
實現(xiàn) MinStack 類:
- MinStack() 初始化堆棧對象。
- void push(int val) 將元素val推入堆棧洪囤。
- void pop() 刪除堆棧頂部的元素徒坡。
- int top() 獲取堆棧頂部的元素。
- int getMin() 獲取堆棧中的最小元素瘤缩。
解題思路:
- 獲取到最小元素可以使用一個最小值棧存取最小元素
- stack 入棧時喇完,min_stack 入棧最小值
- stack 出棧是,min_stack 出棧最小值
- 獲取最小值時剥啤,min_stack 獲取當前棧頂元素
3. 柱狀圖中最大的矩形
給定 n 個非負整數(shù)锦溪,用來表示柱狀圖中各個柱子的高度不脯。每個柱子彼此相鄰,且寬度為 1 海洼。
求在該柱狀圖中跨新,能夠勾勒出來的矩形的最大面積。
解題思路:
通過對邊界出入棧的方式遍歷計算坏逢。
較為復(fù)雜域帐,建議查看圖解:
解析
4. 滑動窗口最大值
給你一個整數(shù)數(shù)組 nums,有一個大小為 k 的滑動窗口從數(shù)組的最左側(cè)移動到數(shù)組的最右側(cè)是整。你只可以看到在滑動窗口內(nèi)的 k 個數(shù)字肖揣。滑動窗口每次只向右移動一位浮入。
返回 滑動窗口中的最大值 龙优。
解題思路:
- 新建一個棧
- 遍歷數(shù)組前k位,若新的元素大于棧頂元素事秀,則棧頂元素出棧彤断,最終保留棧底是前k位最大的元素(下標)。
- 從第k位開始遍歷易迹,新元素大于棧頂元素宰衙,則棧頂元素出棧,直到當前元素小于棧頂元素睹欲。
- 計算棧內(nèi)的元素最大與最小值(即下標間距)大于k值供炼,則 shift 掉棧底元素,使其符合滑動窗口的要求窘疮。窗口內(nèi)只有 k 個數(shù)量的元素袋哼。
- 將棧底元素存入數(shù)組中。在進行下一個窗口的判斷闸衫。
5. 接雨水
給定 n 個非負整數(shù)表示每個寬度為 1 的柱子的高度圖涛贯,計算按此排列的柱子,下雨之后能接多少雨水楚堤。
解題思路:
- 確定兩個邊界之間能裝多少水
- 當前下標疫蔓,棧頂,和棧頂?shù)那耙粋€下標身冬,共同組成了一個 凹 型衅胀,能盛當前高度與棧頂前一個下標高度中較小值與棧頂高度差的高度 ?? 左右下標(即當前下,棧頂前一個下標)的間距(間距需要 - 1)酥筝。