給定乙個陣列和滑動視窗的大小,找出所有滑動視窗裡數值的最大值。例如,如果輸入陣列及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為; 針對陣列的滑動視窗有以下6個: , , , , , 。
掃瞄每個滑動視窗的所有數字並找出其中的最大值。如果滑動視窗的大小為k,則需要o(k)時間找到最大值。
對於長度為 n 的輸入陣列,演算法的時間複雜度為o(nk)。
class solution
return value;
}};
演算法思想:借助乙個輔助雙端佇列,步驟如下:如果隊列為空,則當前數字入佇列。
如果佇列不為空且當前數字大於等於隊尾數字,則隊尾數字出隊直到隊尾元素小於當前待入隊的數字,或者在隊尾數字出隊的過程中,隊列為空,則當前數字入隊。
如果當前數字小於隊尾數字,則當前數字入隊尾。
如果佇列頭部數字超出滑動視窗的範圍(比如,佇列頭部數字在陣列中的位置是第乙個,但是滑動視窗的範圍在第二個到第四個,那麼佇列頭部數字直接就可以刪除),則刪除佇列頭部數字(pop_front())。
由於要考慮佇列頭部數字是否超過了滑動視窗的範圍,所以佇列中存放的元素不能是原來的陣列的數字,而應該是陣列中數字的下標值。
class solution
for(unsigned int i=size; i= num[index.back()])
index.pop_back();
if(!index.empty() && index.front()<=(int)(i - size) )//如果佇列頭部數字超出滑動視窗的範圍,則刪除佇列頭部數字
index.pop_front();
index.push_back(i);
}res.push_back(num[index.front()]);//滑到最後乙個數字時,迴圈內部並沒有執行讀隊頭操作,所以這裡要留意下。
return res;
}};
或者可以做如下修改。只是調整了其中兩行**的順序
class solution
res.push_back(num[index.front()]); // #####################
for(unsigned int i=size; i= num[index.back()])
index.pop_back();
if(!index.empty() && index.front()<=(int)(i - size) )
index.pop_front();
index.push_back(i);
res.push_back(num[index.front()]);// ###########################
}return res;
}};
劍指 面試題59 1 滑動視窗的最大值
題目 給定乙個陣列 nums 和滑動視窗的大小 k,請找出所有滑動視窗裡的最大值。思路 設定雙端佇列存放可能成為最大值的數字對應的下標 c class solution return res python class solution def maxslidingwindow self,nums l...
劍指offer面試題7
面試題7 用兩個棧實現佇列 using namespace std template class cqueue 預備知識 佇列 佇列也是一種常見的資料結構 特點是先進先出 fifo 在stl中有stack和queue兩個容器 template class stack 成員函式 empty size ...
劍指offer面試題11
面試題1 數值的整數的次方 題目 實現函式double power double base,int exponent 求base的 exponent次方。不得使用庫函式,同時不需要考慮大數問題。思路 首先應該明確指數的可能取值 正整數,0,負整數 另外還需要考慮底數是0的情形。對於負整指數,我們可以...