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