题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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 maxInWindows(const vector & num, unsigned int size) 4 { 5 vector result; 6 if(num.size() == 0 || size < 1) 7 return result; 8 deque qmax; 9 for(int i=0;i= size-1)//第一次需要处理w个然后才开始存入最大值res28 {29 result.push_back(num[qmax.front()]);30 }31 }32 return result;33 }34 };