定義:顧名思義,單調棧,就是從棧頂到棧底元素遞增或者遞減的棧(看題目需求,特判相等的元素)。
實現:例如實現一個單調遞增的棧,比如現在有一組數10,3,7,4,12, 2。從左到右依次入棧,
10入棧時
,棧為空,直接入棧。棧內元素為10
3入棧時
,比棧頂元素10小,直接入棧。棧內元素為3,10
7入棧時
,比棧頂元素3大,會破壞單調性,所以將棧頂元素出棧。此時7比棧頂10小,直接入棧,棧內元素為7,10;
4入棧時
,比棧頂元素7小,直接入棧,棧內元素為4,7,10。
12入棧時
,比棧頂元素4大,棧頂元素出棧,此時比棧頂元素7大,棧頂元素出棧,此時比棧頂元素10大,棧頂元素出棧,此時棧為空,直接入棧。棧內元素為12。
2入棧時
,比棧頂元素12小,直接入棧。棧內元素為2,12。
應用:
對于應用2和應用3,最簡單的思想,我們以序列中的每個元素為最小值,然后向左和向右擴展直到遇到比它還小的元素停止,然后記錄這個子序列的長度,最后遍歷尋找最大結果。如果直接暴力的話,時間復雜度很高,是不可取的,回想一下上述例子,正好可以用一個單調遞減的棧來維護向左和向右擴展的操作。當每個元素入棧時,為了不破壞棧內單調性,棧內比它大的元素都要出棧,此時這些出棧的元素向右擴展的最大的位置就是
。而當前入棧元素向左擴展的最小的位置就是
。綜上,在出棧時,更新棧內元素向右擴展的最大位置,在入棧時,更新入棧元素向左擴展的最小位置。
。