[LeetCode] Sliding Window Maximum 滑动窗口最大值

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> res;
        deque<int> q;
        for (int i = 0; i < nums.size(); ++i) {
            if (!q.empty() && q.front() == i - k) q.pop_front();
            while (!q.empty() && nums[q.back()] < nums[i]) q.pop_back();
            q.push_back(i);
            if (i >= k - 1) res.push_back(nums[q.front()]);
        }
        return res;
    }
};

时间复杂度为O(n)。提示我们要用双向队列deque来解题,并提示我们窗口中只留下有用的值,没用的全移除掉。果然Hard的题目我就是不会做,网上看到了别人的解法才明白,解法又巧妙有简洁,膜拜啊。大概思路是用双向队列保存数字的下标,遍历整个数组,如果此时队列的首元素是i - k的话,表示此时窗口向右移了一步,则移除队首元素。然后比较队尾元素和将要进来的值,如果小的话就都移除,然后此时我们把队首

class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) 
    {
        deque<int> dq;
        vector<int> result;
        int len = nums.size();
 
        for (int i = 0 ; i < len ; i++) 
        {
             //当前窗口是[i-k+1, i-k+2, ... i-1, i ](i>=k-1时),如果队头不在这个范围内,则丢弃
            if (!dq.empty() && dq.front() < i-k+1) 
                dq.pop_front();
                
            //把队列中小的删掉,保持队列递减
            while (!dq.empty() && nums[dq.back()] < nums[i])
                dq.pop_back();
                
            dq.push_back(i);
            
            //从k-1开始,每次的队头就是最大值
            if (i >= k-1) 
                result.push_back(nums[dq.front()]);
        }
        return result;
    }
 
};
--------------------- 
作者:思翊 
来源:CSDN 
原文:https://blog.csdn.net/u012243115/article/details/47035643 
版权声明:本文为博主原创文章,转载请附上博文链接!

元素加入结果中即可

猜你喜欢

转载自blog.csdn.net/jwy2014/article/details/86556294