滑动窗口中的最大值

思路:把有可能成为滑动窗口最大值的数值存入一个两端开口的队列deque,在队列里存入数字在数组里的下标,而不是数值,当一个数字的下标与当前处理的数字的下标之差大于或者等于滑动窗口的大小时,这个数字已经从窗口中滑出,可以从队列中删除了。

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> maxInWin;
        if(num.size()>=size && size>=1)
        {
            deque<int> index;
            //先处理第一个窗口
            for(int i=0;i<size;++i)
            {
                //队列不为空,并且当前值比队列最后一个值对应的数大时,弹出最后一个数
                while(!index.empty() && num[i]>=num[index.back()])
                    index.pop_back();
                //当队列中没有比当前值大时,压入队列中
                index.push_back(i);
            }
            for(int i=size;i<num.size();++i)
            {
                //队首一直为窗口最大值
                maxInWin.push_back(num[index.front()]);
                while(!index.empty() && num[i]>=num[index.back()])
                    index.pop_back();
                //当当前处理的下标减队首下标大于窗口大小时,弹出队首
                if(!index.empty() && i-index.front()>=size)
                    index.pop_front();
                index.push_back(i);
            }
            maxInWin.push_back(num[index.front()]);
        }
        return maxInWin;
    }
};

  

posted @ 2019-05-19 13:35  LJ的博客  阅读(234)  评论(0编辑  收藏  举报