視窗以及視窗內最大值或最小值的更新結構

2021-09-26 07:12:34 字數 2081 閱讀 6575

什麼是視窗?假設現在有一陣列及兩個指標l和r,兩指標只能在陣列上向右移動且不能回退,那麼[l…r]這個區域即是乙個視窗。

假設現在有一需求,即在視窗滑動的過程中我們需要求視窗內的最大值。這時我們需求借助最大值的更新結構,即雙端佇列。該更新結構需要保持其中的元素從大到小(從左到右)排序。

加數過程

指標r在陣列上向右滑動的過程中,滑動視窗的範圍會擴大。此時我們需要將指標r所指向的元素加入到雙端佇列的尾部中去,當然這一加入過程還需要滿足雙端佇列中元素從左到右從大到小的規律。

假如現在有如下陣列,其中r指標從0號位開始往後移動:

當r指標指向0號元素時,我們將(0,4)加入到雙端佇列中,其中0表示元素4的座標;

當r指標指向1號元素時,此時發現1號元素小於佇列尾部的元素4,因此我們將(1,3)加入到雙端佇列中,此時雙端佇列中的陣列元素滿足從左到右從大到小的規律;

同理,當r指標指向2號元素時,此時發現2號元素小於佇列尾部的元素3,因此我們將(2,1)加入到雙端佇列中;

當指標r指向3號元素時,此時發現佇列中尾部的元素1小於此時的元素2,故將佇列尾部的元素彈出,並再次判斷佇列尾部的元素是否還小於當前的元素2,我們發現3並不小於2,故將(3,2)加入佇列中;

當指標r指向4號元素時,此時發現佇列尾部的元素2小於5,故而將2彈出。佇列中的元素3和4也同理依次彈出。此時發現隊列為空,所以將(4,5)加入到佇列中;

當指標r指向5號元素時,此時發現5號元素小於佇列尾部的元素5,因此我們將(5,3)加入到雙端佇列中;

當指標r指向6號元素時,此時發現6號元素不小於佇列尾部的元素3,因此我們將佇列尾部的元素3彈出,並將(6,3)加入到雙端佇列中。自此,最大值的更新結構的加數過程就結束了。

上述的加數過程簡單的講即為,每次都將r指標指向的當前元素輪詢的與佇列中尾部的元素比較,如果當前元素大於等於佇列的尾部的元素那麼就將該尾部元素從尾部彈出,彈到尾部元素大於當前元素或隊列為空為止。最後再將該當前元素從尾部加入到佇列中去。

減數過程

指標l在陣列上向右滑動的過程中,滑動視窗的範圍會縮小。此時我們需要將指標l所指向的元素從雙端佇列的頭部中彈出(如果該元素還存在)。

假設當前處於上述加數的過程4,此時雙端佇列的狀態如下所示,即此時佇列中存在元素(0,4),(1,3)和(3,2)。

現在我們來模擬一下最大值的更新結構的減數過程,假設指標l從陣列的0號位開始往右移動:

當l指標指向0號元素時,此時發現雙端佇列中存在0號元素4,此時我們將0號元素4從佇列的頭部彈出;

當l指標指向1號元素時,此時發現雙端佇列中存在1號元素3,此時我們將1號元素3從佇列的頭部彈出;

當l指標指向1號元素時,此時發現雙端佇列中並不存在2號元素(之前加數過程被彈出了),那麼指標l繼續向右移動;…

可以發現最大值的更新結構的減數過程很簡單,即每次判斷l指標指向的當前元素是否在雙端佇列的頭部,若存在則彈出,否則l指標繼續向右移動。

注意:上述為了便於討論,我們假設雙端佇列中儲存的元素是(i,arr[i])。但是雙端佇列其實可以只儲存元素的下標,因為當要比較元素的大小時,我們完全可以通過下標去或獲取下標所對應的元素。

假如在視窗滑動的過程中我們需要求視窗內的最小值。這時我們需求借助最小值的更新結構,同樣也是雙端佇列。該更新結構需要保持其中的元素從小到大(從左到右)排序。

由於最小值的更新結構和最大值的更新結構的加數過程與減數過程是相似的,下面我們僅簡單的描述其過程。

加數過程

最小值更新結構加數過程簡單地講即為,每次都將r指標指向的當前元素輪詢的與佇列中尾部的元素比較,如果當前元素小於等於佇列的尾部的元素那麼就將該尾部元素從尾部彈出,彈到當前元素大於尾部元素或隊列為空為止。最後再將該當前元素從尾部加入到佇列中去。

減數過程

減數過程很簡單,即每次判斷l指標指向的當前元素是否在雙端佇列的頭部,若存在則彈出,否則l指標繼續向右移動。

滑動視窗內最大值

雙端佇列方法 佇列頭部一直都是當前窗內的最大元素下標 deque1為空或佇列尾元素大於等於當前元素,入佇列 佇列尾元素小於當前元素,彈出隊尾元素,確保佇列頭部是最大元素 若佇列尾索引減去佇列頭部索引大於k 1,彈出佇列頭部元素 暴力方法 vectorp 239 maxslidingwindow ve...

視窗和視窗內最大值的更新結構

對於乙個陣列,我們有乙個l來表示視窗的最左邊,還有乙個r來表示最右邊。l和r只能向右移動,不能回退。l往右走是減數,r往右走就是加數,並且l也不能超過r。如果你想要得到乙個視窗的最大值,那麼你當然可以通過遍歷的方法來實現,但這樣每次獲得視窗中最大值的代價就是遍歷的代價。如果想要o 1 的時間複雜度那...

求滑動視窗中的最大值和最小值

滑動視窗 一般使用雙指標演算法,左指標l和右指標r之間的空間稱為視窗,由於指標是不斷移動的,從而視窗也可以移動,稱為滑動視窗。滑動視窗的最值 由於視窗是移動的,移動的過程中有新元素的加入也有舊元素的彈出。每一次元素的加入或彈出都可能使視窗中元素的最值發生變化,也正是會發生變化,使得無法直接獲取任意時...