题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
解题思路:本题使用双端队列来处理,双端队列实现窗口的更新。
插入规则(保证队头对应值最大):
1)为空时,下标i放入qmax中
2)不为空,取当前qmax队尾下标j,如果arr[j]>arr[i]将i放入队尾,否则,则一直qmax中弹出队尾,直到某一下标使得qmax中对应值arr[j]>arr[i],将i放入队尾。
弹出规则:
1)qmax队头下标等于i-w,弹出队头(已出窗口)
1 class Solution { 2 public: 3 vector<int> maxInWindows(const vector<int>& num, unsigned int size) 4 { 5 vector<int> result; 6 if(num.size() == 0 || size < 1) 7 return result; 8 deque<int> qmax; 9 for(int i=0;i<num.size();i++) 10 { 11 if(qmax.empty()) 12 { 13 qmax.push_back(i); 14 } 15 else 16 { 17 while(!qmax.empty() && num[qmax.back()] <= num[i]) 18 { 19 qmax.pop_back(); 20 } 21 qmax.push_back(i); 22 } 23 if(qmax.front() == i-size)//去除掉超出当前窗口的下标 24 { 25 qmax.pop_front(); 26 } 27 if( i >= size-1)//第一次需要处理w个然后才开始存入最大值res 28 { 29 result.push_back(num[qmax.front()]); 30 } 31 } 32 return result; 33 } 34 };