思路:
用一个双端队列存储在滑动窗口里的元素下标。保证队首元素是滑动窗口的最大值的下标。
当新元素进入队列时,如果队尾的元素不比新元素大,那么就将队尾元素弹出。因为该元素不如新元素大,生存能力又不如新元素强。
新元素进队后,就可以判断队头元素是否需要出队。如果出队,新的队头元素就是此时的所求。
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
if(nums.empty() || k==0)
return res;
deque<int> que;
//先处理前k个元素,此时不需要输出
for(int i=0;i<k;++i){
//如果队尾元素不比新元素大,就将队尾元素弹出
while(!que.empty() && nums[que.back()]<=nums[i])
que.pop_back();
que.push_back(i);
}
//队首元素就是此时的最大值
res.push_back(nums[que.front()]);
//处理后面的元素,每次for循环都会输出一次
for(int i=k;i<nums.size();++i){
while(!que.empty() && nums[que.back()]<=nums[i])
que.pop_back();
que.push_back(i);
//如果队首元素出了窗口的范围,则弹出
if(!que.empty() && que.front()<i-k+1)
que.pop_front();
res.push_back(nums[que.front()]);
}
return res;
}