monotonic :單調,遞增或遞減
這是一個看起來很簡單的資料結構,
擁有 O(N) time complexity 的優秀特性,
但要能實際應用在問題裡卻不是很容易,
如果是用 heap 的題目,可以思考是否可以轉為使用 monotonic stack。
優點:linear time complexity
所有的元素最多只會進去一次,也最多只會出去一次。
Monotonic
元素 push 上 stack 前,會把破壞此 stack 單調性質(遞增或遞減)的元素移除。(LIFO)
可以找到目前元素向左看(for all i < current_i)第一個比他小 / 大的元素
可以找到 目前為止最大的數
某些元素因為不符合和現元素相比的某個條件,在未來不會被用到了,可被捨棄。
某些元素被捨棄時,可能是答案。[[1944. Number of Visible People in a Queue]]
一個遞增的 monotonic stack,新增 a 進去,top 為頂元素。
對這些被 pop 的元素來說,a 是在他們右側第一個比他們小的元素