劍指offer----滑動視窗的最大值
阿新 • • 發佈:2018-12-15
題目描述 給定一個數組和滑動視窗的大小,找出所有滑動窗口裡數值的最大值。例如,如果輸入陣列{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]}。
class Solution { public: //採用一個雙向佇列來儲存,隊頭放的是最大的視窗元素,隊尾放的是視窗的最後一個元素 //deque中放的是index值並非實際值 vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> res; //如果視窗大小為0,視窗大小大於陣列大小,直接返回空陣列 if(size==0||num.size()<size)return res; deque<int> save_index; for(int i=0;i<num.size();++i) { //判斷新加入元素的位置,因為save_index為從大到小排列 while(save_index.empty()!=true&&num[i]>num[save_index.back()])save_index.pop_back(); //如果當前索引值和隊頭索引值的差值加一要大於size的話,表示當前視窗過大,要縮減 while(save_index.empty()!=true&&i-save_index.front()+1>size)save_index.pop_front(); save_index.push_back(i); //從i+1>=size開始輸出視窗最大值 if(i+1>=size)res.push_back(num[save_index.front()]); } return res; } };