給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小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)
}
滑動視窗最大值
題目描述 給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小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 解釋 滑動視窗的位置 最大...