0
点赞
收藏
分享

微信扫一扫

滑动窗口最大值

霸姨 2022-04-30 阅读 128

滑动窗口最大值

滑动窗口需要维护一个单调队列,与单调栈相似,队列中的元素都是单调递增或递减的。


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;
    }
};
举报

相关推荐

0 条评论