專題講解 單調棧

2021-10-05 12:15:49 字數 2331 閱讀 9498

單調棧的核心思想是維護乙個單調遞增或者單調遞減的雙向佇列。佇列中儲存陣列的索引值。

我們以一道基本例題為例,了解單調棧的簡單框架。

這道題目是一道可以用單調棧解決的問題。我們維護乙個序列,如果進來的數字比隊伍右側索引對應的數字大,彈出佇列右側。

class

solution

(object):

defdailytemperatures

(self, t)

:# 單調棧

ans =[0

]*len(t)

cur =

[[t[0]

,0]]

## 公升序排列

for i in

range(1

,len

(t))

:while cur and t[i]

> cur[-1

][0]

: value, index = cur.pop(

) ans[index]

= i-index

[t[i]

, i]

)return ans

單調棧其實應用的場合並不多,除了這類尋找下乙個更大的數字之外的題目,還有一類題目是尋找固定長度的區間的最值。

# 進入單調棧,進行判斷

stack(i)

if i>=k-1:

0]])

return ans

這裡的單調棧(遞減棧)完成了三個工作:

判斷是否滑窗移動之後,最大元素是否還存在

對新來的元素進行尾遞補

新增新的元素

這道題可以選擇dp的方法

因此,可以看出來,其實這個問題可以轉換為,每次在乙個長度為k的視窗中選取dp[i]的最大值。

class

solution

:def

constrainedsubsetsum

(self, nums: list[

int]

, k:

int)

->

int:

n =len(nums)

queue = collections.deque(

) dp = nums[:]

ans = nums[0]

# 單調棧

defstack

(i):

if queue and queue[0]

== i-k:

queue.popleft(

)# 注意每次在dp上進行滑動

while queue and dp[queue[-1

]]<=dp[i]

: queue.pop(

)for i in

range(1

,n):

stack(i-1)

dp[i]

=max

(dp[queue[0]

]+nums[i]

,nums[i]

) ans =

max(ans,dp[i]

)return ans

單調棧講解

以前一直有接觸,但是一直沒單獨進行分析處理 單調棧 維護其中元素單調性的棧 也就是從棧底到棧頂都是有序的 維護 如果入棧的元素滿足單調性,直接入棧 如果不滿足,就讓棧頂元素出棧,直到能讓入棧元素滿足單調性為止,再將元素入棧 已經出棧的元素就被拋棄 題解鏈結 單調棧問題 我們可以用乙個單調棧來維護每個...

單調佇列,棧專題

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

演算法 單調棧專題

單調棧是一種理解起來很容易,但是運用起來並不那麼簡單的資料結構。一句話解釋單調棧,就是乙個棧,裡面的元素的大小按照他們所在棧內的位置,滿足一定的單調性。題目是這樣的,給乙個陣列,返回乙個大小相同的陣列。返回的陣列的第i個位置的值應當是,對於原陣列中的第i個元素,至少往右走多少步,才能遇到乙個比自己大...