天天看點

淺談單調棧

淺談單調棧

本篇随筆簡單談一下算法競賽中的一種資料結構——單調棧。

提前說一聲,本篇随筆是一個需要前置知識的随筆。在學習單調棧之前,首先需要讀者知道什麼是棧。

這需要最基礎的資料結構知識。

然後要有不低于初二的數學素養,知道單調這個詞的含義。

也就是說正常人都差不多會。

一、單調棧的概念

單調棧。

就是前置知識加和。

單調+棧。

也就是說,對于這個單調棧來講,棧中的元素是滿足單調性的。

那麼當然有單調遞增棧和單調遞減棧等等的分類。

這就是單調棧了。

二、單調棧的應用

單調棧的概念非常簡單,那麼它的精髓就在于應用,也就是在棧上加了個單調性,它能夠支援解決的問題有什麼變化。

單調棧的應用是,維護序列中一個數左/右第一個大于/小于它的數。

你可能會說,都是\(O(N)\)複雜度,為什麼用單調棧?直接掃描就可以啦?

但是單調棧是用\(O(N)\)的時間,掃描完一整個序列并且處理出所有數左/右第一個大于/小于它的數。

直接掃描的話,複雜度明顯是\(O(N^2)\)的。

為什麼單調棧可以做到這一點呢?

假設我們要維護一個序列中所有數右側第一個大于它的數在哪。

那麼我們維護單調遞減棧,顯然,如果新入棧的元素不符合單調棧的性質,就彈棧直到它符合單調棧性質為止。在這個彈棧的過程中,顯然地,那些被彈出來的東西都比它小(廢話),而且還在它前面,也就是說,如果一個元素可以讓這個單調棧出現彈棧操作,那麼對于彈出來的所有東西來講,這個元素就是它們的答案。

這就是單調棧的妙用啦!

其應用還是比較局限的。