剑指offer---滑动窗口的最大值

我开始的方法。。。跟原始人一样 还是太菜

class Solution 
{
public:
    int FindMax(const vector<int> &a, int start, int end)
    {
        int MaxNum = -100000;
        for (int i = start; i <= end; ++i)
        {
            MaxNum = max(MaxNum, a[i]);
        }
        return MaxNum;

    }
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> re;
        int in_size = num.size();
        if (size <= 0) return re;
        if (size > 0 && size < in_size)
        {
            for (int i = 0; i <= (in_size - size); ++i)
            {
                int temp = FindMax(num, i, i + size - 1);
                re.push_back(temp);
            }

            return re;
        }
        else if(size==in_size)
        {
            int temp=FindMax(num,0,in_size-1);
            re.push_back(temp);
            return re;
        }
        else return re;
        
    }
};

 

更好的方法 利用到队列

class Solution {
public:
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> res;
        deque<int> s;
        for(unsigned int i=0;i<num.size();++i){
            while(s.size() && num[s.back()]<=num[i])//从后面依次弹出队列中比当前num值小的元素,同时也能保证队列首元素为当前窗口最大值下标
                s.pop_back();
            while(s.size() && i-s.front()+1>size)//当当前窗口移出队首元素所在的位置,即队首元素坐标对应的num不在窗口中,需要弹出
                s.pop_front();
            s.push_back(i);//把每次滑动的num下标加入队列
            if(size&&i+1>=size)//当滑动窗口首地址i大于等于size时才开始写入窗口最大值
                res.push_back(num[s.front()]);
        }
        return res;
    }
};
posted @ 2017-08-02 18:12  双马尾是老公的方向盘  阅读(101)  评论(0编辑  收藏  举报