双向队列 滑动窗口求解区间最大值

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。

例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5};

思路:

初始化一个双向队列(滑动窗口) 队列头部放置该区间窗口最大值

每次到来一个新的值,

  • 从队列末尾开始,将比该新值小的移出队列(因为这些值不可能成为区间最大值)
  • 同时判断队列头部的最大值是否过期(即是否因为窗口滑动而过期,通过下标和区间大小判定)

同时这2步都是可能多次移除多个值

每次循环之后判断队列头部的最大值下标是否,大于区间长度,是移入结果中(即考虑一开始滑动窗口还没建立的情况)

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> res;
        deque<int> windows;
        for(int i=0;i<num.size();i++)
        {
            while(windows.size() && num[windows.back()]<num[i])
                windows.pop_back();
            while(windows.size() && i-windows.front()+1>size)
                windows.pop_front();
            windows.push_back(i);
            if(size && i+1>=size)
                res.push_back(num[windows.front()]);
     
            
        }
        return res;   
    }
};

 

展开阅读全文

没有更多推荐了,返回首页