棧和單調(diào)隊(duì)列)
單調(diào)棧和單調(diào)隊(duì)列有一種數(shù)據(jù)結(jié)構(gòu),它內(nèi)部的數(shù)據(jù)始終保持從小到大(或從大到?。┑捻樞颉S盟鼇?lái)解決"找下一個(gè)更大元素"、"滑動(dòng)窗口最值"等問(wèn)題,又快又優(yōu)雅。一、單調(diào)棧什么是單調(diào)棧?單調(diào)棧就是棧內(nèi)元素始終保持單調(diào)遞增或單調(diào)遞減的棧。核心操作:當(dāng)新元素入棧時(shí),如果破壞了單調(diào)性,就不斷彈出棧頂元素,直到單調(diào)性恢復(fù)。單調(diào)遞增棧(從底到頂遞增): 入棧 3: [3] 入棧 1: [3, 1] ← 13,可以(棧底到棧頂是遞減的,這里改為遞增示例)讓我重新用單調(diào)遞減棧舉例:?jiǎn)握{(diào)遞減棧(棧底到棧頂遞減): 入棧 5: [5] 入棧 3: [5, 3] ← 35,遞減,OK 入棧 4: 43,彈出3 → [5, 4] ← 45,遞減,OK 入棧 6: 64,彈出4 → 65,彈出5 → [6]經(jīng)典問(wèn)題:下一個(gè)更大元素給定數(shù)組[2, 1, 2, 4, 3],對(duì)每個(gè)元素找右邊第一個(gè)比它大的元素。用單調(diào)遞減棧(從底到頂遞減): i=0, val=2: ???,壓入 → [2] i=1, val=1: 12,壓入 → [2, 1] i=2, val=2: 21,彈出1,