演算法 單調棧專題

2022-03-20 15:12:50 字數 1173 閱讀 6129

單調棧是一種理解起來很容易,但是運用起來並不那麼簡單的資料結構。一句話解釋單調棧,就是乙個棧,裡面的元素的大小按照他們所在棧內的位置,滿足一定的單調性。

題目是這樣的,給乙個陣列,返回乙個大小相同的陣列。返回的陣列的第i個位置的值應當是,對於原陣列中的第i個元素,至少往右走多少步,才能遇到乙個比自己大的元素(如果之後沒有比自己大的元素,或者已經是最後乙個元素,則在返回陣列的對應位置放上-1)。

簡單的例子:

input: 5,3,1,2,4

return: -1 3 1 1 -1

explaination: 對於第0個數字5,之後沒有比它更大的數字,因此是-1,對於第1個數字3,需要走3步才能達到4(第乙個比3大的元素),對於第2和第3個數字,都只需要走1步,就可以遇到比自己大的元素。對於最後乙個數字4,因為之後沒有更多的元素,所以是-1。

暴力做的結果就是o(n^2)的時間複雜度,例如對於乙個單調遞減的陣列,每次都要走到陣列的末尾。那麼用單調棧怎麼做呢?先來看**:

public

static

int nextexceed(int

input)

stack

stack = new stack<>();//

單調棧,棧頂元素永遠最小,存放下標

for (int i = 0; i < input.length; i++)

stack.push(i);

}return

result;

}

我們維護這樣乙個單調遞減的stack,stack內部存的是原陣列的每個index。每當我們遇到乙個比當前棧頂所對應的數(就是input[monostack.top()])大的數的時候,我們就遇到了乙個「大數「。這個」大數「比它之前多少個數大我們不知道,但是至少比當前棧頂所對應的數大。我們彈出棧內所有對應數比這個數小的棧內元素,並更新它們在返回陣列中對應位置的值。因為這個棧本身的單調性,當我們棧頂元素所對應的數比這個元素大的時候,我們可以保證,棧內所有元素都比這個元素大。對於每乙個元素,當它出棧的時候,說明它遇到了自己的next greater element,我們也就要更新return陣列中的對應位置的值。如果乙個元素一直不曾出棧,那麼說明不存在next greater element,我們也就不用更新return陣列了。在這個例子中,對於每乙個元素都只有一次入棧和出棧的操作,因此時間複雜度只有o(n)。

參考:

專題講解 單調棧

單調棧的核心思想是維護乙個單調遞增或者單調遞減的雙向佇列。佇列中儲存陣列的索引值。我們以一道基本例題為例,了解單調棧的簡單框架。這道題目是一道可以用單調棧解決的問題。我們維護乙個序列,如果進來的數字比隊伍右側索引對應的數字大,彈出佇列右側。class solution object defdaily...

單調佇列,棧專題

a題 hdu 1506 題目大意 給你n個點,每乙個點代表當前座標下的矩形的高度,然後問你最大的矩形面積。具體思路 我們可以用乙個棧維護最大值,這個棧內的元素都是保持單調的,如果當前輸入的數比棧頂元素小的話,這個時候我們先算一波棧裡面的最大值,判斷停止的時候是當棧頂元素比當前輸入的元素小的時候停就可...

LeetCode 單調棧專題

單調棧,顧名思義,是維持單調遞增或遞減的棧 單調遞增棧的形式如上,適合尋找,距離他最近的,比他小的,左右兩邊元素 與單調遞增棧的用法相反 單調遞增棧的原理 class solution st.push i 單調棧套路 return ans 單調遞減棧 class solution st.push i...