stack中保持著一定的順序,例如遞增或是遞減。
如果要新增的element比top還大/小。就把top pop出去。然後繼續往下比,直到保持一定的遞增或是遞減的順序。通常是找序列中比自己後面,但是值比自己還大/小的題目。
Good reference : Sum of Subarray Minimums
找出之前比自己還小的值。
找出之後比自己還小的值。
另一種寫法,如果沒辦法從後面走訪數列的話
剛剛第一種情況是往前或是往後看,第一個比自己大或小的值。另一種情況是往前看或是往後看,找出最大值。如果自己本身是最大值就是自己。
以下的code是從自己往後看,看到最大值的index。
以下的code使從自己往前看,看到最大值的index。
後來想想,其實找fordward max或是backward max不需要使用stack,只要用以下簡單的方法即可。
給你一個vector<int> height,下雨過後會有多少雨水留在裡面。
- 雨水留在裡面的多少會由,這格往前往後看的最大值決定。
- 所以使用monotonic stack來計算每格往前往後看的最大值。
也可以使用以下簡單的方法
給你一個每日溫度的數列vector<int> temperatures。求出過給天後,會比現在還溫暖。例如:
Input: temperatures = [73,74,75,71,69,72,76,73]
Output: [1,1,4,2,1,1,0,0]
解題思路:
這是一個典型的單調遞增stack的問題。
2022/07/06
和上面的相比,stack只需存index即可。
2022/10/29
因為這題是找出後面第一個比自己大的值,所以是monotonic stack
找出price左邊連續比它還小的數值。
- 一開始有想到monotone stack但是怎麼寫都是不對。原因是少了一個變數。這邊使用了stack<pair<int, int>>。多了一個資訊。統計這個數字的span。全部的span加起來剛好是輸入price的個數。
- 使用monotone stack是因為不需要找比自己還大的數字。
- 可以看成我們在整理這個vector
[100]
[100, 80]
[100, 80, 60]
[100, 80, [60, 70]] –> [100, 80, 70(2)]
[100, 80, 70(2), 60]
[100, 80, [70(2), 60, 75]] –> [100, 80, 75(4)]
[100, [80, 75(4), 85]] –> [100, 85(6)]
2022/10/29
因為這題是找出前面比自己還要大的數,所以使用monotonic stack。
應用前面的找出前面和後面比自己高或是比自己低的位置,如果左右邊都應用的話,就是找出以第i個位置的山峰或是山谷。
例如: [1,4,3,7,4,5],可以畫出以下的圖
這邊可以發現,對index = 2 來說,如果以他為local minimal的subarray,可以得到。
同理,對index = 4來說,以他為local minimal的subarray,可以得到
Maximum score的定義是,subarray的最小值,乘上subarray的長度。另外Good subarray的定義是,必須包含index = k。
- 因為Score的定義是,subarray的最小值乘上長度。所以算是找local minimal => 使用monotonic stack找出區域山谷。
- 最後看每個index所構成的區域山谷,使否有包含index = k。
找出histogram中最大面積的長方形。
- 因為長方形的高度會被,最矮的數值決定。=> 找出以此index的區域山谷。
- 找出以每個index為山谷之後,就可以依序找出每個面積,得到最大值。
給你一個vector<int>找出所有subarray的組合中,每個subarray的最小值的和為多少?
- 這題參考了 Sum of Subarray Minimums 對monotinic stack有更深一層的了解。
- 另外參考了官神的答案,因為官神對於計算個數比較直覺。
計算個數參考以下的註解。- 因為要知道subarray最小值,所以某個subarray的最小值取決於,這個subarray的左邊和右邊數值都是比目前的值還要大。
- 找出自己前面和後面的最小值 ==> monotonic stack
- why two pass? 因為條件和自己前後都有關係。
給你一個vector<int> maxHeights,當用每個index當成mountain array的top,則兩邊勢必要配合top做修正,修正完之後才會成為mountain array,返回最大的mountain array sum。
- 參考官方答案。
- 我們把每個index都當成mountain top。
- 如果兩邊遇到比自己大的就會變成maxHeights[i]。所以可以容易計算出sum += (j - i) * maxHeights[i];
- 遇到比自己小的(j),則會被j的左邊或是右邊的sum決定。
- 所以問題變成找出比自己小的index。
- 另外卡住的點是,以前使用monotonic stack會在pop之後更新資料,但是現在是pop完之後才處理,所以方向改變了。
- 這題感覺就是monotonic stack的題目,但是就是思考不出來怎麼處理中間比較矮的人。
- 參考lee215解答
leetcode
刷題