滑动窗口最大值
滑动窗口需要维护一个单调队列,与单调栈相似,队列中的元素都是单调递增或递减的。
struct SingleQueue
{
std::list<int> m_queue;
void push(int n)
{
while(!m_queue.empty() && m_queue.back() < n)
{
m_queue.pop_back();
}
m_queue.push_back(n);
}
void pop(int n)
{
if(n == m_queue.front())//(要抛出的节点可能已经被抛出)
{
m_queue.pop_front();
}
}
int getMax()
{
return m_queue.front();
}
};
class Solution {
public:
SingleQueue m_sinQueue;
vector<int> res;
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
for(int i = 0; i < nums.size(); ++i)
{
if(i < k-1)//先把窗口的前 k - 1 填满
{
m_sinQueue.push(nums[i]);
}
else // 窗口开始向前滑动
{
m_sinQueue.push(nums[i]);//先将新元素加入单调队列
res.push_back(m_sinQueue.getMax());//获取当前最大值
m_sinQueue.pop(nums[i-k+1]);//将队列(窗口)的头结点抛出
}
}
return res;
}
};