單調棧結構
給定乙個不含有重複值的陣列 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 這裡一定要注意所說的遞增遞減指的是出棧...