剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(LeetCode)
类似题:leetcode 第 239 题:滑动窗口最大值(C++)_zj-CSDN博客
暴力法就不写了
写一个单调栈的:
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){//
//移除比当前元素小的所有元素,他们不可能是最大的
while(!q.empty() && nums[q.back()] < nums[i]) q.pop_back();
//队头不在窗口范围内
while(!q.empty() && i - q.front() >= k) q.pop_front();
q.push_back(i);
if(i >= k-1) res.push_back(nums[q.front()]);//从窗口大小大于等于k再开始操作
}
return res;
}
};
换个容易理解的写法:
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> res;
if(nums.empty()) return res;
deque<int> q;//双向队列,队头始终存储窗口最大值的索引
for(int i = 0; i < k; ++i){//处理第一个窗口
while(!q.empty() && nums[q.back()] < nums[i]) q.pop_back();
q.push_back(i);
}
res.push_back(nums[q.front()]);
for(int i = k; i < nums.size(); ++i){//
//移除比当前元素小的所有元素,他们不可能是最大的
while(!q.empty() && nums[q.back()] < nums[i]) q.pop_back();
//队头不在窗口范围内
while(!q.empty() && i - q.front() >= k) q.pop_front();
q.push_back(i);
res.push_back(nums[q.front()]);
}
return res;
}
};
可以看这儿的解析:单调队列解题详解 - 滑动窗口最大值 - 力扣(LeetCode)
另外这题的难点在于怎么快速获取最大值,所以使用优先级队列或许也是可行的