239. Sliding Window Maximum

https://leetcode.com/problems/sliding-window-maximum/

http://blog.csdn.net/x_shuck/article/details/51458504
维护一个双向队列,从大到小,deq[0]为队列中的最大值。
每加入一个数:从末尾开始遍历,把比该数小的数都pop掉。
进行n-k+1次循环,
首先判断deq[0]是否已经不在窗口内,不在则pop;
再加入新的数。

为什么用if就可以,不需要用while。

代码来自该博客:

class Solution {  
public:  
    vector maxSlidingWindow(vector& nums, int k) {  
        int len = nums.size();  
        if (len == 0)  
            return vector();  
        vector res(len - k+1);  
        deque mydeque(1, 0);//队列里存储的是数组的下标  
        for (int i = 1; i < k; i++){  
            for (int j = mydeque.size() - 1; j >= 0; j--){  
                if (nums[mydeque[j]] < nums[i]){  
                    mydeque.pop_back();  
                }  
            }  
            mydeque.push_back(i);  
        }  
        res[0] = nums[mydeque[0]];  
        for (int i = k; i < len; i++){  
            if (mydeque[0] < i-k+1){  
                mydeque.pop_front();  
            }  
            for (int j = mydeque.size() - 1; j >= 0; j--){  
                if (nums[mydeque[j]] < nums[i]){  
                    mydeque.pop_back();  
                }  
            }  
            mydeque.push_back(i);  
            res[i - k + 1] = nums[mydeque[0]];  
        }  
        return res;  
    }  
};

你可能感兴趣的:(239. Sliding Window Maximum)