滑動視窗 題解

2021-10-19 13:27:56 字數 2004 閱讀 7196

原題見力扣:

這裡講的滑動視窗並不是計網tcp中的滑動視窗. 不過移動的方式其實差不多,就是在一串資料上以固定大小的視窗滑動,每次都在該視窗內尋找最大值. 這與深度學習中的max_pooling1d思想神似.(stride=1, kernel=k)這題用暴力解法當然十分簡單,時間複雜度為o(kn),但本題的要領並不在此.

class

solution

vector<

int> rec;

int len = nums.

size()

;for

(int i =

0; i <= len-k;

++i)

rec.

push_back

(maxx);}

return rec;}}

;

本題蘊含的乙個知識點是單調佇列,通過單調佇列可以將求滑窗內最大值的時間複雜度從o(k)降為o(1). 下面學習一下單調佇列.

單調佇列是一種特殊的佇列,佇列中的元素按照從隊頭到隊尾遞增或遞減的順序排列 (並不嚴格遞增或嚴格遞減). 這樣,就有可能在常數的時間內取得到佇列的最大值.

結合滑動視窗,這樣的佇列應該如何設計?我們結合乙個例子來看.(k=3)

掃瞄第1個元素,直接入隊

掃瞄第2個元素,入隊並更新佇列

掃瞄第3個元素,入隊.

現在已經形成了第1個滑動視窗,直接取隊頭輸出,序列為3

接著掃瞄到-3,更新佇列,取隊頭輸出,序列為3 3.

最後,掃瞄到5,原隊中3應該先出隊,5進隊後更新佇列.

取隊頭輸出,序列為3 3 5.

這樣的單調佇列,滿足:

演算法流程:

返回結果列表res

複雜度:

class

solution

vector<

int> rec;

int len = nums.

size()

; deque<

int> dq;

dq.push_back

(nums[0]

);for(

int i =

1; i < len;

++i)

// 視窗保持遞減

while

(!dq.

empty()

&& dq.

front()

< nums[i]

)while

(!dq.

empty()

&& dq.

back()

< nums[i]

) dq.

push_back

(nums[i]);

// 形成視窗,開始存放資料

if(i >= k-1)

}return rec;}}

;

力扣題解 滑動視窗最大值

題目 給定乙個陣列 nums,有乙個大小為 k 的滑動視窗從陣列的最左側移動到陣列的最右側。你只可以看到在滑動視窗內的 k 個數字。滑動視窗每次只向右移動一位。返回滑動視窗中的最大值。1 3 1 3 5 3 6 7 3 1 3 1 3 5 3 6 7 3 1 3 1 3 5 3 6 7 5 1 3 ...

Week5 D 滑動視窗滑動視窗

week5 d 滑動視窗滑動視窗 zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position ...

week5 D 滑動視窗滑動視窗

zjm 有乙個長度為 n 的數列和乙個大小為 k 的視窗,視窗可以在數列上來回移動.現在 zjm 想知道在視窗從左往右滑的時候,每次視窗內數的最大值和最小值分別是多少.例如 數列是 1 3 1 3 5 3 6 7 其中 k 等於 3.window position minimum value max...