單調佇列高階

2021-09-30 05:28:12 字數 717 閱讀 2413

題目位址

題目大意: 給定乙個數列,長度n(1<=n<=100000), 值m和k, 求最長子序列,滿足當中的最大值-最小值差不小於m且不大於k。

與前面介紹的題目不太一樣,這道題反過來了,沒有規定窗長度,相反是要我們求要求條件的最大的窗。

道理還是一樣,當窗長規定為l時,我們只需要儲存i的前l-1個數當中的最大值和最小值,而要我們求窗長時,我們可以自己設定窗的開始位置start,同樣儲存從位置start到到當前i的這段數中的最大值單調佇列和最小值單調佇列。

假設quemax是最遞減佇列,quemin是遞增佇列,分別儲存的是從start到i這段長為i-start+1的數的最大值和最小值,headmax, headmin 是他們佇列的頭索引。如果m<=quemax[headmax]-quemin[headmin]<=k,那這段長為i-k+1的序列就滿足題目的要求。

假設我們start到i的序列滿足要求,我們接下來當然是看加上第i+1個數後是否還滿足要求。方法如下:

1.將第i+1個數插入到兩個佇列當中,然後看是否滿足要求,如果滿足要求,儲存長度(i+1)-k+1。

2.否則,如果quemax[headmax]-quemin[headmin]<=m,不作任何處理;

如果quemax[headmax]-quemin[headmin]>=k,那麼我們就要增加headmin或headmax,為了求最長序列,我們當然先擇下標最小的那個頭元素了。一直將headmin或headmax增加到滿足條件。

單調棧,單調佇列

大多數借鑑了 單調佇列是什麼呢?可以直接從問題開始來展開。poj 2823 給定乙個數列,從左至右輸出每個長度為m的數列段內的最小數和最大數。數列長度 n 106,m n 我們知道,解法 在暴力列舉的過程中,有乙個地方是重複比較了,就是在找當前的f i 的時候,i的前面其它m 1個數在算f i 1 ...

單調棧 單調佇列

單調棧 單調佇列是在棧和佇列的基礎上加上單調結構的資料結構。如果乙個元素入棧或入隊,他會檢查之前的元素,如果之前的元素不可能是答案的解,那麼就彈出元素,使得當前元素入棧或入隊。leetcode 239 滑動視窗最大值 此題是單調佇列,每次遇到乙個元素,一直從隊尾彈出,直到隊尾元素大於該元素為止。還需...

單調棧 單調佇列

啊學完了來寫個總結吧 顧名思義,單調,就是指色彩單一某乙個容器裡面的元素都是遞增或遞減的,而單調棧和單調佇列就是這個容器。單調棧 單調棧模板 其他的我就不說了,講下為什麼單調棧是從後往前掃瞄 當我們在判斷乙個數後面第乙個比它大的數時,前提是後面的數已經被處理了,所以我們要從後往前掃瞄。我做了兩種做法...