其他分享
首页 > 其他分享> > LeetCode 239. 滑动窗口最大值

LeetCode 239. 滑动窗口最大值

作者:互联网

题目:
给定数组和窗口大小k,输出滑动过程中窗口的最大值

解法:
本题求得是窗口内的最大值,而滑动这一性质又要求不能随意丢弃信息。这里可以使用单调队列来完成这个需求——保留一定的信息、动态变化,现在问题是如何设计这个单调队列。我们维护一个单调减的队列,由此,每次队列pop_front之后,队列头依然是队列中最大的那个。为了方便与窗口比较,单调队列中存储的是下标。

代码:

using namespace std;
class Solution {
public:
    vector<int> maxSlidingWindow(vector<int>& nums, int k) {
        vector<int> ans;
        deque<int> de;
        de.push_back(0);
        for (int i = 1; i < k && i < nums.size(); i++) {
            while (!de.empty() && nums[i] >= nums[de.back()])
                de.pop_back();
            de.push_back(i);
        } //构建初始队列
        ans.push_back(nums[de.front()]);
        if (k < nums.size()) {
            for (int i = k;i < nums.size();i++) {
                while (!de.empty() && de.front() <= i - k)
                    de.pop_front(); //将队列头已经出了窗口的给pop掉
                while (!de.empty() && nums[i] >= nums[de.back()])
                    de.pop_back(); //维护其为单调队列
                de.push_back(i);
                ans.push_back(nums[de.front()]);
            }
        }
        return ans;
    }
};

标签:nums,队列,最大值,de,back,239,ans,push,LeetCode
来源: https://www.cnblogs.com/Unparalleled-Calvin/p/16131454.html