码迷,mamicode.com
首页 > Windows程序 > 详细

【LeetCode 239】Sliding Window Maximum

时间:2015-07-18 15:35:19      阅读:117      评论:0      收藏:0      [点我收藏+]

标签:

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].

 

题意:

  给定一个数组序列,以及一个固定大小的窗口K,用k从前到后扫描一次数组,返回窗口每个状态下的最大值。

思路:

  使用双端队列deque当做滑动窗口,保证每个状态下最大值总是在队首。比如[1,3,-1,-3,5,3,6,7],那么deque的状态分别为[1] 、[3] (前2步,填装滑动窗口) ,(从第三步正式开始)[3,-1]、 [3,-1,-3]、[5]、[5,3]、[6]、[7],可以看到每次队列的队首元素都是当前滑动窗口的最大值,具体过程可参考代码,有注释。时间复杂度O(n)。

C++:

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        
        vector<int> ret;
        if(nums.size() == 0)
            return ret;
        
        //双端队列,存储的是元素的下标,不是元素的值
        deque<int> slideWindow;
        for(int i = 0; i < k; i++)
        {
            //如果要进队列的数比它前面的数字大,则将它前面的数字从后面删除,直到它前边的数字比它大或者队列为空
            while(!slideWindow.empty() && nums[i] >= nums[slideWindow.back()])
            {
                slideWindow.pop_back();
            }
            
            //加入新元素到队列
            slideWindow.push_back(i);
        }
        
        for(int i = k; i < nums.size(); i++)
        {
            //队首元素即为当前窗口最大值
            ret.push_back(nums[slideWindow.front()]);
            
            //如果要进队列的数比它前面的数字大,则将它前面的数字从后面删除,直到它前边的数字比它大或者队列为空
            while(!slideWindow.empty() && nums[i] >= nums[slideWindow.back()])
            {
                slideWindow.pop_back();
            }
            
            //如果当前队首的元素已经不在窗口内部,则将其从队列前边删除
            if(!slideWindow.empty() && slideWindow.front() <= i - k)
                slideWindow.pop_front();
            
            //加入新元素到队列
            slideWindow.push_back(i);
        }
        
        //不要忘了最后一个窗口的结果 - -
        ret.push_back(nums[slideWindow.front()]);
        
        return ret;
    }
};

 

【LeetCode 239】Sliding Window Maximum

标签:

原文地址:http://www.cnblogs.com/tjuloading/p/4656906.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!