滑动窗口中的最大值

主宰稳场 提交于 2020-03-25 21:42:54

思路:把有可能成为滑动窗口最大值的数值存入一个两端开口的队列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;
    }
};

  

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!