給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。
例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為;
針對陣列的滑動視窗有以下6個:,,
,,,。
視窗大於陣列長度的時候,返回空
我們可以使用乙個雙端佇列deque。
陣列的第乙個數字是2,把它存入佇列中。
第二個數字是3,比2大,所以2不可能是滑動視窗中的最大值,因此把2從佇列裡刪除,
再把3存入佇列中。
第三個數字是4,比3大,同樣的刪3存4。
此時滑動視窗中已經有3個數字,而它的最大值4位於佇列的頭部。
第四個數字2比4小,但是當4滑出之後它還是有可能成為最大值的,所以我們把2存入佇列的尾部。
下乙個數字是6,比4和2都大,刪4和2,存6。
就這樣依次進行,最大值永遠位於佇列的頭部。
但是我們怎樣判斷滑動視窗是否包括乙個數字?
應該在佇列裡存入數字在陣列裡的下標,而不是數值。
當佇列中首個成員的下標與當前處理的數字的下標之差大於或者相等於滑動視窗大小時,這個數字已經從視窗中滑出,可以從佇列中刪除。
整體過程示意圖
劍指offer 滑動視窗問題
給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 本人思路 每次滑動,總是減去乙個值,新增乙個值 如果新增值大於上乙個視窗的最大值,那麼新增值為本視窗的最大值 否則,如果上乙...
劍指offer 64 滑動視窗的最大值
給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 滑動視窗應當是佇列,但為了得到滑動視窗的最大值,佇列序可以從兩端刪除元素,因此使用雙端佇列。原則 對新來的元素k,將其與雙端...
劍指offer64 滑動視窗的最大值
給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 不能每次選取範圍再比較,這樣時間複雜度太高。可以建立乙個佇列,佇列首部是最大值索引,每次要先去掉小於當前數的所有索引,再去掉...