單調棧結構

2021-10-13 22:38:54 字數 1730 閱讀 1190

單調棧結構

給定乙個不含有重複值的陣列 arr,找到每乙個 i 位置左邊和右邊離 i 位置最近且值比 arr[i] 小的位置。返回所有位置相應的資訊。

輸入描述:

第一行輸入乙個數字 n,表示陣列 arr 的長度。

以下一行輸出 n個數字,表示陣列的值。

輸出描述:

輸出n行,每行兩個數字 l 和 r,如果不存在,則值為-1,下標從0開始。

示例1輸入

7

3 4 1 5 6 2 7

輸出
-1 2

0 2-1 -1

2 53 5

2 -1

5 -1

備註:

1 ≤n

≤1000000

1 \le n \le 1000000

1≤n≤10

0000

0−1000000≤a

rri≤

1000000

-1000000 \le arr_i \le 1000000

−10000

00≤a

rri​

≤100

0000

題解:明顯的單調棧。從左往右遍歷陣列,確保棧中的元素從棧頂到棧底滿足嚴格遞減結構就行。

舉個例子(左邊最小值為例),棧中的元素為 ,對於大於 3 的元素,4 永遠不可能稱為最近小於 a[i] 的值,所以需要在棧中維護乙個遞減關係,以去除無用的元素。

**:

#include

#include

using

namespace std;

const

int n =

1000001

;int n, a[n]

;int stk[n]

;int mn_ret[n]

, mx_ret[n]

;int

main

(void

) top =-1

;for

(int i = n -

1; i >=0;

--i )

for(

int i =

0; i < n;

++i )

printf

("%d %d\n"

, mn_ret[i]

, mx_ret[i]);

return0;

}

簡潔寫法:
#include

#include

using

namespace std;

const

int n =

1000001

;const

int inf =

0x3f3f3f3f

;int n, a[n]

;int stk[n]

;int left[n]

, right[n]

;int

main

(void

)else right[stk[

--top]

]= i;

}for

(int i =

1; i <= n;

++i )

printf

("%d %d\n"

, left[i]-1

, right[i]-1

);return0;

}

單調棧結構

題目 給定乙個不含重複數值的陣列,找到每乙個i位置左右兩邊第乙個比arr i 小的值的下標。如果不存在則下標為 1 解暴力解 時間複雜度為n 2 高階 使用單點棧結構,時間複雜度為 o n 單調棧找小的,棧底放較小值 找大的棧底放較大值。如題,找相鄰最近較小,所以棧底到棧頂公升序。遍歷陣列,如果棧為...

單調棧結構及其應用

單調棧 解決乙個陣列中,對於每個數,求左邊離它最近的比它大 小 的數,右邊離它最近的比它大 小 的數,時間複雜度o n 實現。1.乙個陣列可化為乙個直方圖,陣列內數值代表該位置的高度 邊長為1的小正方形的個數 求這個直方圖可以形成的最大矩形面積 即小正方形個數 int maxrecfrombotto...

資料結構 單調棧

上班無事,刷力扣發現了個新名詞 單調棧 題目 496.下乙個更大元素 i 名字上就聽的出來,單調棧中存放的資料應該是有序的,所以單調棧也分為單調遞增棧和單調遞減棧 單調遞增棧 棧中資料出棧的序列為單調遞增序列 單調遞減棧 棧中資料出棧的序列為單調遞減序列 ps 這裡一定要注意所說的遞增遞減指的是出棧...