/*这道题目整体的思想就是通过一个双头队列deque去维护当前窗口内的最大值,维护分为两个部分:1、每次加入一个元素就去判断这个元素是否比队列中的尾部大,如果大的话,那么就尾删该元素,直达队列为空或者尾元素大于等于要加入的元素。2、当窗口开始移动之后,需要判断移除的窗口元素是否为当前最大值,如果是要头删。紧接着就是在窗口包含k个元素的时候,每次完成上述两个操作后,将队列的头元素保存(即当前窗口中的最大值)。
*/
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n=nums.size();
deque<int> m_deque;
vector<int> ans(n-k+1,0);
//先找出初始的滑动窗口中的最大值,通过双头队列,然后移动的时候,不断的去维护
for(int i=0;i<n;++i)
{
//开始滑动的时候
//需要先判断当前移除窗口的数值是不是当前窗口中的最大值,是的话就要对队列进行一个更新
if(i>=k&&nums[i-k]==m_deque.front())m_deque.pop_front();
while(!m_deque.empty()&&m_deque.back()<nums[i])//当双头队列的尾部小于本身的时候
{
m_deque.pop_back();
}
m_deque.push_back(nums[i]);
//k-1的时候,窗口刚好包含了完整的k个元素
if(i>=k-1)ans[i-k+1]=m_deque.front();
}
return ans;
}
};