解题思路
-
说实话,没专门学过,很难想到单调队列这种数据结构。。
-
在思考过程中,其实是想到要构造一个队列来维护当前有序集合,我想的是 LRU 那种做法了,就差一步,差的就是要意识到当前元素大于队尾元素时,队尾元素可以直接舍弃,这样,用链表也能实现单调队列。
-
我会在 Algorithm101 中记录单调队列这种数据结构。
代码
// 单调队列
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> m;
vector<int> res;
// 这里面有个很好玩的地方
// i 不能声明为 size_t 类型
// 因为后面有计算 i-k,k 为 int,结果永远不会小于 0
for (int i = 0; i < nums.size(); ++i) {
while (!m.empty() && nums[m.front()] < nums[i]) {
m.pop_front();
}
m.push_front(i);
if (i >= k-1) {
res.push_back(nums[m.back()]);
}
if (m.back() <= i-k+1) {
m.pop_back();
}
}
return res;
}
};