LeetCode Sliding Window Maximum

Given an array nums, there is a sliding window of size k which is moving from the very left of the array to the very right. You can only see the k numbers in the window. Each time the sliding window moves right by one position.
For example, Given nums = [1,3,-1,-3,5,3,6,7], and k = 3.

Window position                Max
---------------               -----
[1  3  -1] -3  5  3  6  7       3
 1 [3  -1  -3] 5  3  6  7       3
 1  3 [-1  -3  5] 3  6  7       5
 1  3  -1 [-3  5  3] 6  7       5
 1  3  -1  -3 [5  3  6] 7       6
 1  3  -1  -3  5 [3  6  7]      7

Therefore, return the max sliding window as [3,3,5,5,6,7].
Note: You may assume k is always valid, ie: 1 ≤ k ≤ input array's size for non-empty array.

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        int len = nums.size();
        if (len < 1 && k < 1) {
            return vector<int>();
        }
        deque<int> ids;
        vector<int> res(len - k + 1);
        
        for (int i=0; i<len; i++) {
            // remove values which can't be max value
            while (!ids.empty() && nums[ids.back()] < nums[i]) {
                ids.pop_back();
            }
            
            ids.push_back(i);
            if (i < k - 1) {
                continue;
            }
            
            res[i - k + 1] = nums[ids.front()];
            
            // remove left most index which not in the range any more
            int lmost = i - k + 1;
            while (!ids.empty() && ids.front() <= lmost) {
                ids.pop_front();
            }
        }
        return res;
    }
};

第二轮:
稍微简洁一点

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        
        int len = nums.size();
        vector<int> res;
        list<int> que;
        for (int i=0; i<len; i++) {
            while (!que.empty() && nums[i] >= nums[que.back()]) {
                que.pop_back();
            }
            
            que.push_back(i);
            
            while (!que.empty() && i - que.front() >= k) {
                que.pop_front();
            }
            if (i >= k - 1) {
                res.push_back(nums[que.front()]);
            }
        }
        
        return res;
    }
};
posted @ 2015-07-20 01:00  卖程序的小歪  阅读(181)  评论(0编辑  收藏  举报