給定一個數組和滑動窗口的大小,找出全部滑動窗口裏數值的最大值。例如,若是輸入數組{2,3,4,2,6,2,5,1}及滑動窗口的大小3,那麼一共存在6個滑動窗口,他們的最大值分別爲{4,4,6,6,6,5}; 針對數組{2,3,4,2,6,2,5,1}的滑動窗口有如下6個: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。數組
這道題咱們須要轉換下參考對象,像物理學中同樣。優化
題目描述的是滑動窗口在數組上移動。若是咱們以滑動窗口爲對象,那麼就是數組在滑動窗口上移動。spa
顯然,能夠看出滑動窗口就是一個隊列,數組中的一個一個的數先進去,先出來。code
此外這題還有一個能夠優化的一點就是不必定須要把全部數字存進去隊列裏,只須要把之後有可能成爲最大值的數字存進去。對象
還有一點要注意的是隊列裏保存的是下標,而不是實際的值,由於窗口移動主要是下標的變化blog
固然還有其餘解法,好比利用兩個棧去實現這個隊列,從而使得查詢時間複雜度下降到O(n)隊列
function maxInWindows(num, size) { let res = []; if(size == 0){ return res; } let begin; let queue = []; for(let i = 0; i < num.length; i++){ begin = i - size + 1;//表明滑動窗口的左邊界 if(queue.length == 0){ queue.push(i); }else if(begin > queue[0]){ queue.shift(); } while((queue.length != 0) && (num[queue[queue.length - 1]] <= num[i])){ queue.pop(); } queue.push(i); if(begin >= 0){ res.push(num[queue[0]]) } } return res; }