1. 程式人生 > >劍指offer----滑動視窗的最大值

劍指offer----滑動視窗的最大值

題目描述 給定一個數組和滑動視窗的大小,找出所有滑動窗口裡數值的最大值。例如,如果輸入陣列{2,3,4,2,6,2,5,1}及滑動視窗的大小3,那麼一共存在6個滑動視窗,他們的最大值分別為{4,4,6,6,6,5}; 針對陣列{2,3,4,2,6,2,5,1}的滑動視窗有以下6個: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

class Solution {
public:
//採用一個雙向佇列來儲存,隊頭放的是最大的視窗元素,隊尾放的是視窗的最後一個元素
//deque中放的是index值並非實際值
    vector<int> maxInWindows(const vector<int>& num, unsigned int size)
    {
        vector<int> res;
        
        //如果視窗大小為0,視窗大小大於陣列大小,直接返回空陣列
        if(size==0||num.size()<size)return res;
        
        deque<int> save_index;
        
        for(int i=0;i<num.size();++i)
        {
        //判斷新加入元素的位置,因為save_index為從大到小排列
            while(save_index.empty()!=true&&num[i]>num[save_index.back()])save_index.pop_back();
        //如果當前索引值和隊頭索引值的差值加一要大於size的話,表示當前視窗過大,要縮減
            while(save_index.empty()!=true&&i-save_index.front()+1>size)save_index.pop_front();
            save_index.push_back(i);
            //從i+1>=size開始輸出視窗最大值
            if(i+1>=size)res.push_back(num[save_index.front()]);
        }
        return res;
    }
};