資料結構與演算法 滑動視窗問題

2021-09-26 16:36:34 字數 1388 閱讀 5625

【問題】

有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次 向右邊滑乙個位置。

例如,陣列為[4,3,5,4,3,3,6,7],視窗大小為3時:

[4 3 5]4 3 3 6 7

4[3 5 4]3 3 6 7

4 3[5 4 3]3 6 7

4 3 5[4 3 3]6 7

4 3 5 4[3 3 6]7

4 3 5 4 3[3 6 7]

視窗中最大值為5 視窗中最大值為5 視窗中最大值為5 視窗中最大值為4 視窗中最大值為6視窗中最大值為7如果陣列長度為n,視窗大小為w,則一共產生n-w+1個視窗的最大值。

請實現乙個函式。

輸入:整型陣列arr,視窗大小為w。

輸出:乙個長度為n-w+1的陣列res,res[i]表示每一種視窗狀態下的 以本題為例,結果應該返回。

【思路】

迅速得到視窗內的最大值:

使用乙個雙端佇列,雙端佇列嚴格按照從大到小排。

資料增加:

若增加的數從尾進,若增加的數可以放在尾部,則放入,若無法放入,則將尾部數彈出,直到增加的數可以從尾部進入。

資料減少:

若過期的數的位置是雙端佇列的頭部,則過期的數從頭部彈出,若不是頭部,則不彈出。

【滑動視窗】

滑動視窗模式是用於在給定陣列或鍊錶的特定視窗大小上執行所需的操作,比如尋找包含所有 1 的最長子陣列。從第乙個元素開始滑動視窗並逐個元素地向右滑,並根據你所求解的問題調整視窗的長度。在某些情況下視窗大小會保持恆定,在其它情況下視窗大小會增大或減小。

下面是一些你可以用來確定給定問題可能需要滑動視窗的方法:

問題的輸入是一種線性資料結構,比如鍊錶、陣列或字串

你被要求查詢最長/最短的子字串、子陣列或所需的值

你可以使用滑動視窗模式處理的常見問題:

1)大小為 k 的子陣列的最大和(簡單)

2)帶有 k 個不同字元的最長子字串(中等)

3)尋找字元相同但排序不一樣的字串(困難)

【上面問題**實現】

vector

slidingwindowmaxarray

(vector arr, int window)

mydeque.

push_back

(i);

//把位址i往進加

if(mydeque.

front()

==i-window)

//i-window代表過期的下標

if(i>=window-1)

//初始形成視窗

}return res;

}

資料結構 單調棧 單調佇列 解決滑動視窗問題

單調佇列解答 單調佇列!優先佇列 單調佇列是為了保證佇列內的元素具有單調性,在保持了元素原本順序的同時,對元素進行了過濾,捨棄了會影響單調性的元素 而優先佇列本質上還是個佇列 不會捨棄任何元素,每個元素都在佇列之中,但是在佇列中的位置由優先佇列定義的優先順序來確定,損失了原陣列中的資料相對位置關係。...

資料結構與演算法 約瑟夫問題

問題描述 編號為1 2 n 的小朋友圍成一圈,從編號為k 1 k n 的小朋友開始報數,報到m的小朋友出列,該小朋友的下一位重新開始從0開始報數,數到m的小朋友再次出列,依次類推,直到所有小朋友出列。由此產生乙個出列編號的佇列。package 鍊錶 author lyq on 2019 12 23 ...

資料結構與演算法 約瑟夫問題

已知n個人 以編號1,2,3,n分別表示 圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列 他的下乙個人又從k開始報數,數到m的那個人又出列 一詞重複下去。直到圓桌的人全部出列。試用c 程式設計實現 include include include define error 0 type...