标签:双端队列 image nbsp 从后往前 i++ span com 比较 size
用一个双端队列,队首是当前窗口最大值索引。
滑动一次,判断当前最大值是否过期;
新增的值从尾开始比较,把所有比他小的值都丢掉。
例如{2,3,4,2,6,5,1,3,2},窗口3
deque max
2 {0} 2
23 {1} 3
234 {2} 4 此时队列长度达到3,开始输出第一个窗口的最大值即队首
342 {2,3} 4
426 {4} 6
265 {4,5} 6
651{4,5,6} 6
513 {5,7} 5
132 {7} 3
class Solution { public: vector<int> maxInWindows(const vector<int>& num, unsigned int size) { vector<int> res; deque<int> s;//保存窗口最大值的索引 for(unsigned int i=0;i<num.size();i++){ while(s.size()&&num[s.back()]<=num[i])//只统计当前窗口内的最大值,所以要全部出队,碰到比当前值小的,说明s最前面已经不是最大值了,从后往前出队列 s.pop_back(); while(s.size()&&i-s.front()+1>size) s.pop_front(); s.push_back(i); if(size&&i+1>=size){//当i第一次走到了窗口边界,这才开始王res里面放最大值 res.push_back(num[s.front()]); } } return res; } };
标签:双端队列 image nbsp 从后往前 i++ span com 比较 size
原文地址:https://www.cnblogs.com/pacino12134/p/11270191.html