单调队列的元素保证是单调递增或者是单调递减的,即队头元素是最大值或最小值。
#include <vector>
#include <deque>
using namespace std;
class MonotonicQueue
{
private:
deque<int>data;
public:
void push(int n)
{
while(!data.empty()&&data.back()<n)
data.pop_back();
data.push_back(n);
}
int max()
{
return data.front();
}
void pop(int n)
{
if(!data.empty()&&data.front()==n)
data.pop_front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums,int k)
{
MonotonicQueue window;//声明一个单调队列
vector<int>res;
for(int i = 0;i < nums.size();i++)
{
if(i < k - 1)
{
//先把窗口的前k-1填满,表明前k个元素还没全部进入到单调队列中,我们只将其装满一次,剩下可以通过push和pop来维持
window.push(nums[i]);
}
else
{
//窗口满了,可以开始向前滑动了
window.push(nums[i]);
res.push_back(window.max());
window.pop(nums[i-k+1]);
//nums[i-k+1]就是窗口最后的元素
}
}
return res;
}