原題見力扣:
這裡講的滑動視窗並不是計網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...