演算法 單調棧

2022-10-11 10:45:09 字數 1612 閱讀 8292

單調棧:

從左往右進行遍歷,如果棧頂元素大於等於當前的元素,直接出棧(while 迴圈)

(退出while 迴圈兩個條件,棧空,或者棧不為空,此時棧頂元素小於單前元素)

(if)如果棧不為空,表明棧頂元素小於當前元素,將棧頂元素儲存在當前元素對應下標的陣列中

從右邊向左進行遍歷:

(while) 如果棧頂元素大於當前元素,直接出棧

(if)退出while 迴圈,判斷棧是否為空,如果棧不為空,棧頂元素就是右邊最小元素,直接進賦值,然後讓該元素進棧;

當前元素下乙個最小最大值;

當前元素最近乙個最小值

往左最近最小

往右最近最小

st = 

left, right = ,

n = len(a)

for i, v in enumerate(a):

while st and a[st[-1]]>v:

st.pop()

if st:

left[i] = st[-1]

for i in range(n-1,-1,-1):

v = a[i]

while st and a[st[-1]]>v:

st.pop()

if st:

right[i] = st[-1]

### 496. 下乙個更大元素 i

nums1 中數字 x 的 下乙個更大元素 是指 x 在 nums2 中對應位置 右側 的 第乙個 比 x 大的元素。

給你兩個 沒有重複元素 的陣列 nums1 和 nums2 ,下標從 0 開始計數,其中nums1 是 nums2 的子集。

對於每個 0 <= i < nums1.length ,找出滿足 nums1[i] == nums2[j] 的下標 j ,並且在 nums2 確定 nums2[j] 的 下乙個更大元素 。如果不存在下乙個更大元素,那麼本次查詢的答案是 -1 。

返回乙個長度為 nums1.length 的陣列 ans 作為答案,滿足 ans[i] 是如上所述的 下乙個更大元素 。

> 求解下乙個最近更大的元素,使用的是倒敘比較;

由於b 陣列元素比較多,先對b陣列進行求解下乙個最大,之後將a 陣列對應進去

```python

class solution:

def nextgreaterelement(self, a: list[int], b: list[int]) -> list[int]:

st =

n = len(b)

res = [-1]*n

ans =

# 求解b中下乙個元素的最大值

for i in range(n-1,-1,-1):

v = b[i]

while st and st[-1]<=v:

st.pop()

if st:

res[i]=st[-1]

for x in a:

if x in b:

idx = b.index(x)

return ans

單調棧演算法筆記

定義 單調棧就是棧內元素遞增或者單調遞減的棧,並且只能在棧頂操作。單調棧的維護是o n 的時間複雜度,所有元素只會進進棧一次 性質 單調棧裡面的元素具有單調性 元素加入棧前會把棧頂破壞單調性的元素刪除 使用單調棧可以找到元素向左遍歷的第乙個比他小的元素 單增棧 也可以找到元素向左遍歷第乙個比他大的元...

演算法 單調棧專題

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

演算法之單調棧與單調佇列

單調佇列顧名思義就是具有單一單調性的佇列。給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 數列為 6 4 10 10 8 6 4 2 12 14,求長度為3的數列段內的最大數,使用單調遞減棧。1 6,0 入隊,此時隊列為 6,0 2 4,1 入隊,此時...