棧和佇列 生成視窗最大值陣列

2021-08-08 21:55:59 字數 966 閱讀 7099

【題目】

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

例如,陣列為[4,3,5,4,3,3,6,7],視窗大小為3時:依次出現的視窗為[4,3,5], [3,5,4], [5,4,3], [4,3,3], [3,3,6], [3,6,7]。

如果陣列長度是n,視窗大小是w,則一共產生n-w+1個視窗。

請實現乙個函式。

1、輸入:整型陣列arr,視窗大小w

2、輸出:乙個長度大小為n-w+1的陣列res,res[i]表示每一種視窗下的最大值。例如上面的例子,應該返回[5,5,5,4,6,7]。

【基本思路】

使用雙端佇列,遍歷一遍陣列,假設遍歷到的位置是 i,如果隊列為空或者隊尾所對應的元素大於arr[i],將位置 i 壓入佇列;否則將隊尾元素彈出,再將 i 壓入佇列。此時,判斷隊頭元素是否等於i - w,如果是的話說明此時隊頭已經不在當前視窗的範圍內,刪去。這樣,這個佇列就成了乙個維護視窗為w的子陣列的最大值更新的結構,隊頭元素就是每個視窗的最大值。

【**實現】

#python3.5

defgetmaxwindow

(arr, w):

if arr == none

or w < 1

or len(arr) < w:

return

deque =

res =

for i in range(len(arr)):

while deque and arr[deque[-1]] <= arr[i]:

deque.pop()

if deque[0] <= i - w:

deque.pop(0)

if i-w+1 >= 0:

return res

棧與佇列 移動視窗生成最大值的陣列

有乙個整數型陣列arr和乙個大小為w的視窗從陣列的最左端滑到最右端,視窗每次向右滑動乙個位置。就像是乙個滑動的指標,從頭指向尾,然後輸出視窗中資料的最大值。例如,一組資料為arr 4,3,5,4,3,3,6,7 視窗大小為w 3時 4 3 5 4 3 3 6 7 視窗中最大值為 5 4 3 5 4 ...

生成視窗最大值陣列

題目描述 有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置,求每一種視窗狀態下的最大值。如果陣列長度為n,視窗大小為w,則一共產生n w 1個視窗的最大值 輸入描述 第一行輸入n和w,分別代表陣列長度和視窗大小 第二行輸入n個整數x,表示陣列中的各個元素 輸...

生成視窗最大值陣列

有乙個整型陣列arr和乙個大小為w的視窗從陣列的最左邊滑到最右邊,視窗每次向右邊滑乙個位置,求每一種視窗狀態下的最大值。如果陣列長度為n,視窗大小為w,則一共產生n w 1個視窗的最大值 輸入描述 第一行輸入 n 和 w 分別代表陣列長度和視窗大小 第二行輸入 n 個整數 x ix i xi 表示陣...