棧實戰(zhàn))
1. 力扣高頻算法題深度解析與實戰(zhàn)指南作為程序員面試的金標(biāo)準(zhǔn)力扣LeetCode算法題一直是技術(shù)人成長的必經(jīng)之路。今天我將結(jié)合自己刷題500的經(jīng)驗深度解析394.字符串解碼、739.每日溫度、84.柱狀圖中最大的矩形這三道高頻題目。這些題目分別來自字符串處理、單調(diào)棧和動態(tài)規(guī)劃等核心算法領(lǐng)域在字節(jié)、騰訊等大廠面試中出現(xiàn)率超過60%。2. 394.字符串解碼嵌套字符串的展開藝術(shù)2.1 問題本質(zhì)與核心難點給定一個類似3[a2[c]]的編碼字符串需要展開為accaccacc。這類嵌套結(jié)構(gòu)天然適合用?;蜻f歸處理難點在于多重嵌套時的狀態(tài)保存如遇到[“需要暫存當(dāng)前結(jié)果數(shù)字可能有多位不能簡單用ASCII判斷需要處理字符、數(shù)字、括號三種元素類型2.2 雙棧解法實現(xiàn)細(xì)節(jié)def decodeString(s: str) - str: stack [] num_stack [] current_str current_num 0 for char in s: if char.isdigit(): current_num current_num * 10 int(char) elif char [: num_stack.append(current_num) stack.append(current_str) current_str current_num 0 elif char ]: num num_stack.pop() prev_str stack.pop() current_str prev_str num * current_str else: current_str char return current_str關(guān)鍵點遇到[時當(dāng)前字符串和數(shù)字都要入棧遇到]時要同時操作兩個棧2.3 遞歸解法對比遞歸版本更簡潔但可能棧溢出def decodeString(s, i0): res while i len(s) and s[i] ! ]: if not s[i].isdigit(): res s[i] i 1 else: num 0 while i len(s) and s[i].isdigit(): num num * 10 int(s[i]) i 1 i 1 # skip [ inner, i decodeString(s, i) i 1 # skip ] res inner * num return res, i3. 739.每日溫度單調(diào)棧的經(jīng)典應(yīng)用3.1 問題建模給定溫度列表[73,74,75,71,69,72,76]需要返回等待更暖天數(shù)[1,1,4,2,1,1,0]。這本質(zhì)上是找每個元素右邊第一個更大數(shù)的距離。3.2 單調(diào)棧實現(xiàn)模板def dailyTemperatures(T): stack [] res [0] * len(T) for i in range(len(T)): while stack and T[i] T[stack[-1]]: prev stack.pop() res[prev] i - prev stack.append(i) return res技巧棧中存儲的是下標(biāo)而非溫度值這樣既能比較溫度又能計算天數(shù)差3.3 復(fù)雜度分析與變種時間復(fù)雜度O(n)每個元素最多入棧出棧一次空間復(fù)雜度O(n)最壞情況遞減序列全部入棧變種處理價格跨度、股票波動等問題時同樣適用4. 84.柱狀圖中最大的矩形單調(diào)棧的極致運用4.1 暴力解法到最優(yōu)解演進(jìn)暴力枚舉所有左右邊界O(n2)超時固定高度找最大寬度O(n2)單調(diào)棧優(yōu)化O(n)4.2 單調(diào)棧解法精講def largestRectangleArea(heights): heights [0] heights [0] # 哨兵節(jié)點 stack [] max_area 0 for i in range(len(heights)): while stack and heights[i] heights[stack[-1]]: h heights[stack.pop()] w i - stack[-1] - 1 max_area max(max_area, h * w) stack.append(i) return max_area注意事項首尾添加哨兵節(jié)點避免邊界判斷寬度計算是當(dāng)前i與棧頂下一位的差減一出棧時才計算面積4.3 可視化理解以[2,1,5,6,2,3]為例遇到1時2出棧計算2×12遇到2時6和5相繼出棧6的面積6×(4-2-1)65的面積5×(4-1-1)10最終最大面積為105. 刷題方法論與面試技巧5.1 同類題目歸納字符串解碼類似385.迷你語法分析器、1087.花括號展開單調(diào)棧系列42.接雨水、907.子數(shù)組的最小值之和柱狀圖變種85.最大矩形、221.最大正方形5.2 面試實戰(zhàn)建議先明確問題邊界詢問面試官從暴力解法說起逐步優(yōu)化手寫代碼時注意變量命名用測試用例驗證如空輸入、極端情況5.3 調(diào)試技巧字符串解碼打印每次入棧出棧狀態(tài)單調(diào)棧問題可視化繪制元素進(jìn)出棧過程柱狀圖面積在紙上畫出每個步驟的計算方式這三道題涵蓋了算法面試中最關(guān)鍵的棧應(yīng)用場景。建議在理解的基礎(chǔ)上每個類型至少練習(xí)5道相似題目。我在準(zhǔn)備面試時會專門建立錯題本記錄這類問題的變形和解法規(guī)律。比如發(fā)現(xiàn)很多單調(diào)棧問題都可以通過添加哨兵節(jié)點來簡化代碼這就是刷題量積累后的模式識別能力。