棧與佇列 單調佇列解決滑動視窗最大值

2021-10-19 22:04:15 字數 1374 閱讀 7265

設計單調佇列的時候,pop,和push操作要保持如下規則:

pop(value):如果視窗移除的元素value等於單調佇列的出口元素,那麼佇列彈出元素,否則不用任何操作

push(value):如果push的元素value大於入口元素的數值,那麼就將佇列入口的元素彈出,直到push元素的數值小於等於佇列入口元素的數值為止

以題目示例為例,輸入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3

單調佇列:3,-1

單調佇列:3,-1,-3

單調佇列:5

單調佇列:5,3

單調佇列:6

單調佇列:7

由此可見front永遠儲存著最大值

採用deque來建立單調佇列:

class

solution

}// 如果push的數值大於入口元素的數值,那麼就將佇列後端的數值彈出,直到push的數值小於等於佇列入口元素的數值為止。

// 這樣就保持了佇列裡的數值是單調從大到小的了。

void

push

(int val)

que.

push_back

(val);}

// 查詢當前佇列裡的最大值 直接返回佇列前端也就是front就可以了。

intfront()

};public

: vector<

int>

maxslidingwindow

(vector<

int>

& nums,

int k)

result.

push_back

(que.

front()

);// result 記錄前k的元素的最大值

for(

int i = k; i < nums.

size()

; i++

)return result;}}

;

有人可能會有疑問:

1.為什麼要que.pop(nums[i - k]); // 滑動視窗移除最前面元素,push裡面不是有pop操作嗎?

答:試試nums =【1,-1】 k = 1的情況

2.在佇列中 push元素的過程中,還有pop操作呢,感覺不是純粹的o(n)

答:大家可以自己觀察一下單調佇列的實現,nums 中的每個元素最多也就被 push_back 和 pop_back 各一次,沒有任何多餘操作,所以整體的複雜度還是 o(n)。

空間複雜度因為我們定義乙個輔助佇列,所以是o(k)。

佇列 單調佇列 滑動視窗

總時間限制 12000ms 記憶體限制 65536kb 描述給定乙個長度為n n 10 6 的陣列。有乙個大小為k的滑動視窗從陣列的最左端移動到最右端。你可以看到視窗中的k個數字。視窗每次向右滑動乙個數字的距離。下面是乙個例子 陣列是 1 3 1 3 5 3 6 7 k 3。視窗位置 最小值最大值 ...

C 單調佇列與單調棧 滑動視窗題解

現在有一堆數字共n個數字 n 10 6 以及乙個大小為k的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。例如 the array is 1 3 1 3 5 3 6 7 and k 3.第1行 2個整數n,k k n 1000000 第2行 n個整數,表示陣...

單調佇列 滑動視窗 模板 單調佇列

有乙個長為 n 的序列 a,以及乙個大小為 k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單位,求出每次滑動後視窗中的最大值和最小值。the array is 1,3,1,3,5,3,6,7 and k 3。輸入一共有兩行,第一行有兩個正整數 n,k。第二行 n 個整數,表示序列 a 輸出共兩...