單調棧的應用 每日溫度

2021-10-12 19:57:30 字數 1607 閱讀 1054

何為單調棧?單調棧有什麼用?什麼情況下可以使用單調棧?為什麼要使用單調棧?相信第一次接觸到單調棧的你都會有這些疑問;棧是操作受限的線性表,對於插入和刪除都只能在一端進行,而單調棧就是在棧的基礎上進一步限制了,有單調遞增棧和單調遞減棧,對於單調遞增棧來說,就是需要保證棧中的元素大小是單調遞增的,同理,對於單調遞減棧來說,需要保證棧中的元素大小是單調遞減的

例如:對於(3,2,1)來說,滿足單調遞增棧,對於(1,2,3)來說,滿足單調遞減棧,而(3,1,2)既不滿足單調遞增棧也不滿足單調遞減棧

舉乙個例子,有乙個陣列[1,3,2,7],要將陣列中的元素放到乙個單調遞減棧中,該如何操作:

當前元素為1,由於棧為空,1直接入棧,棧中元素(1)

當前元素為3,3>1,不滿足單調棧,需要執行出棧操作,直至滿足單調棧,也就是1出棧,此時棧為空,3可以入棧,棧中元素(3)

當前元素為2,2<3,滿足單調棧,2可以直接入棧,棧中元素(3,2,)

當前元素為7,7>2,不滿足單調棧,棧頂元素2需要出棧,此時新棧頂元素為3,7依舊大於3,繼續出棧,此時棧為空,7可以入棧,棧中元素(7)

單調棧有什麼用呢?

我看到網上很多介紹了單調棧的作用,總結如下:①如果要找到某個元素之後第乙個比它大的數,可以使用單調遞減棧,因為當要執行出棧操作時,說明當前元素比棧頂元素大;②如果要找到某個元素之後第乙個比它小的數,可以使用單調遞增棧,因為當要執行出棧操作時,說明當前元素比棧頂元素小

其實這個定義可能不太好理解,我第一次看到這個解釋也是雲裡霧裡,那麼我建議直接上題目,通過題目來理解單調棧,並體會使用它的好處,leetcode上有好幾道關於單調棧的典型應用,如:每日溫度、接雨水、柱狀圖最大矩形,這裡以「每日溫度」作為例子來分析:

解題思路:

對於這道題目,其實就是想要讓我們找到每個數之後比第乙個比它大的數,求出他們之間的距離,我一開始想到的是暴力法,也就是使用兩層迴圈,但是雙重迴圈效率太低了,這個時候我們應該要想到單調棧,單調棧不正是為了解決找到在某個數之後第乙個比它大/小的數嗎?因此這裡我們嘗試用單調遞減棧來實現:

順序遍歷整個氣溫陣列,如果當前遍歷到的溫度小於棧頂元素,那麼符合單調遞減棧,直接入棧即可

如果當前遍歷到的溫度大於棧頂元素,那麼不符合單調遞減棧,需要將棧頂元素出棧,此時可以計算當前元素和棧頂元素之間的距離查(通過陣列的索引計算)

乙個元素出棧之後,還應該繼續判斷新棧頂元素與當前元素的關係,如果小於當前元素,繼續出棧,並且求出他們之間的距離差;重複同樣的操作,直至滿足單調棧的性質,當前元素入棧

使用了單調棧之後,我們只需要遍歷一次整個陣列就可以得到結果,大大提公升了時間效率

public

class 每日溫度 }}

return res;

}/**

* 使用單調棧:對於每乙個數來說,要找到右邊第乙個比他大的數,並求出他們的下標差

* @param t

* @return

*/public

int[

]dailytemperatures2

(int

t)stack.

push

(i);

}return res;

}}

單調棧 每日溫度

題目 根據每日 氣溫 列表,請重新生成乙個列表,對應位置的輸出是需要再等待多久溫度才會公升高超過該日的天數。如果之後都不會公升高,請在該位置用 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該是 1,1,4,2,1,1,0,0 思...

leetcode 每日溫度(單調棧)

類似於 柱狀圖中最大的矩形 單調棧 請根據每日 氣溫 列表,重新生成乙個列表。對應位置的輸出為 要想觀測到更高的氣溫,至少需要等待的天數。如果氣溫在這之後都不會公升高,請在該位置用 0 來代替。例如,給定乙個列表 temperatures 73,74,75,71,69,72,76,73 你的輸出應該...

739 每日溫度 單調棧

739.每日溫度 o n 2 o n 2 o n2 class solution else res i tmp return res o n o n o n class solution stack.push i return res 單調棧 monotone stack 是指棧內元素 棧底到棧頂 ...