資料結構與演算法 06 單調棧

2022-06-05 12:06:06 字數 1202 閱讀 3808

顧名思義,單調的棧,可遞增或遞減,主要用於求解nge問題(next greater element)

4 > 1,彈出1,棧為空,壓入4

2 < 4,壓入4

3 > 2,彈出2,3 < 4,壓入4

5 > 3,彈出3,5 > 4,彈出4,棧為空,壓入5

可以發現,每當有數被彈出時,將要入棧的數就是第乙個比彈出的數大的數

模板題,無背景。

2019.12.12 更新資料,放寬時限,現在不再卡常了。

給出項數為 n 的整數數列 a_a1…n。

定義函式 f(i)f(i) 代表數列中第 ii 個元素之後第乙個大於 a_ia**i 的元素的下標,即 f(i)=\min_ f(i)=mini

a**i。若不存在,則 f(i)=0f(i)=0。

試求出 f(1\dots n)f(1…n)。

第一行乙個正整數 nn。

第二行 nn 個正整數 a_a1…n。

一行 nn 個整數 f(1\dots n)f(1…n) 的值。

輸入 #1複製

5

1 4 2 3 5

輸出 #1複製

2 5 4 5 0
【資料規模與約定】

對於 30%30% 的資料,n\leq 100n≤100;

對於 60%60% 的資料,n\leq 5 \times 10^3n≤5×103 ;

對於 100%100% 的資料,1 \le n\leq 3\times 10^61≤n≤3×106,1\leq a_i\leq 10^91≤a**i≤109。

#include #define maxn 3000000

int n, ans[maxn + 10], cnt = 0;

// 將值和索引關聯

struct node stack[maxn + 10], a;

int main()

// 壓入元素

cnt++;

stack[cnt] = a;

} for (int i = 1; i <= n; i++) printf("%d ", ans[i]);

return 0;

}

資料結構與演算法 (3)單調棧

單調棧即滿足單調性的棧,在單調棧中,從棧頂到棧底的元素是嚴格遞增或者遞減的。單調棧的維護是o n o n o n 的時間複雜度的,因為所有的元素只會進棧一次且出棧後再也不會進棧了。單調棧中元素進棧的過程如下 分析 如上圖所示,當遍歷到某些柱子時,當前柱子會和之前的某個柱子形成凹坑而接住雨水。當柱子數...

資料結構 單調棧與單調佇列

830.單調棧 154.滑動視窗 79.滑動視窗的最大值 單調棧的應用場景 求最近的最值 單調佇列的應用場景 求滑動視窗內的最值 單調佇列步驟 值得注意的是單調佇列存的是下標,方便判斷隊頭是否滑出視窗 1.判斷隊頭是否滑出視窗 2.判斷完之後那麼隊頭就是滑動視窗的最值,處理題目邏輯 順序不一定在2,...

資料結構 單調棧與單調佇列

單調棧是棧內元素具有嚴格單調性的一種資料結構。由於我們要找到每個數左邊第乙個比它小的數,那麼我們便可以發現 對於棧中任意乙個數,如果在它右邊存在乙個數比它小 或相等 那麼這個數便是不可能被選中的,直接彈出棧即可。於是我們便可以進行如下操作 按序列舉每乙個數,準備將當前這個數壓棧時,從棧頂開始遍歷,如...