滑動視窗的最大值

2021-09-16 19:06:02 字數 2145 閱讀 1386

給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , , 。

方法一:

乙個i指示每個視窗的起點,在i迴圈內j遍歷該視窗找出最大值。

改進的話,先找出第乙個視窗中的最大值,然後視窗移動的時候觀察上個視窗的最大值是否移除,如果移除就在新視窗中重新遍歷計算,如沒有移除就直接比較新加入視窗的數和上個視窗最大值,得出該視窗最大值。

下面是普通的解法:

classsolution 

result.push_back(max);

}       

returnresult;

}};

方法二:

/*

表達不清楚的地方,請各位批評指正!

這道題可以用雙向佇列解決(就是頭尾都可以push,pop的佇列)

時間複雜度 o(n)

方法如下幾點:

1.當我們遇到新數時候,將新的數和雙向佇列的末尾比較,

若果末尾比新數小,則把末尾pop_back,

直到末尾比新數大或者隊列為空才停止;

2.這樣就保證佇列元素是從頭到尾降序的,

由於佇列裡只有視窗內的數,所以它們其實是視窗內

第一大,第二大…的數。

3.保持佇列裡只有視窗大小的數的方法是,

右邊進乙個,左邊出乙個。

4.由於佇列加新數時,已經刪除了部分沒用的數,

所以佇列頭的數並不一定是視窗最左的數,

這裡有個小技巧,就是佇列中存原陣列的下標,

這樣既可以得到這個數,也可以判斷是否是視窗

左邊的數了。

*/

class solution 

return ret;

}};

其他彙總:

//滑動視窗可用佇列進行實現

//逐個進入並取最大值,始終保證size大小的數

第一種解法:

queuequeue=new linkedlist();

int index=0;

int arrayindex=0;

int max=num[0];

while(indexmax)

arrayindex++;

index++;

if(queue.size()==size)

for(int i=0;i<=num.length-size;i++)

indexqueue.addlast(i);

//隊首元素 的有效期 即 它為最大元素的視窗 是在 他的座標index +size區間內,超過這個

區間就移除掉這個當前最大值 即當前隊首元素

if(indexqueue.getfirst()+size==i)

//當i+1=size)

}

'); (window.slotbydup = window.slotbydup || ).push(); })();

'); (window.slotbydup = window.slotbydup || ).push(); })();

滑動視窗最大值

題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為 針對陣列的滑動視窗有以下6個 幾個注意點 利用雙端佇列實現,如果後者比前者大,前者丟擲,後者進,如果比前者小,壓入佇列,判斷隊頭是否過期,這就需...

滑動視窗最大值

給定乙個陣列和滑動視窗的大小,請找出所有滑動視窗裡的最大值。public class 滑動視窗的最大值 if num.length size size 1 用來儲存可能是滑動視窗最大值的數字的下標 linkedlist indexdeque newlinkedlist for int i 0 i s...

滑動視窗最大值

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