用队列来做,主要完成三个函数 pop push 和getmaxvalue(也就是front)
将前k个值放入队列,一个个放,放进去的值若大于前一个,就把前一个值pop掉,保持队列的front的值是最大的,每滑动一个窗口就将队列的front值放入result中,得到最后的结果
class Solution {
//实现一个队列
private:
class MyQueue{
public:
//实现单调队列
deque<int> que;
void pop(int value)
{//当队列不为空,第二个条件是滑动时使用,滑动过去后,这个值在之前若没有被提出的时候,但现在需要被划走, 因此pop第一个值
if(!que.empty() && value == que.front())
{que.pop_front();}
}
void push(int value)
{//当队列不为空,当加入的值大于前一个值,就将前一个值pop,直到最大值排到队列最前方
while(!que.empty() && value>que.back())
{que.pop_back();}
que.push_back(value);
}
int front()
{//返回队列第一个值 即最大值
return que.front();
}
};
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
MyQueue que;
vector<int> result;
for(int i=0;i<k;i++)
{que.push(nums[i]);}//先将前k个值放入队列
result.push_back(que.front());
for(int i=k;i<nums.size();i++)
{
que.pop(nums[i-k]);//滑动窗口移除前面的值
que.push(nums[i]);//滑动窗口加入最后面的值
result.push_back(que.front());
}
return result;
}
};