题目链接:https://leetcode.cn/problems/sliding-window-maximum/description/
一开始完全不会,看了题解才写出来。我认为难点在于应到了 deque(双向队列)。思想是维护一个单调队列,和单调栈十分相像。
deque 示意如下,如何维护一个单调队列呢:
出口 1 3 -1 入口
- 若为空栈,直接入栈。
- 入栈时,如果入口处的值比 x 大,直接入栈
- 否则,将入口处的值 pop 出来,直到满足上面两个条件
困扰我的就是如何出栈,因为每次总有一个值离开滑动窗口,方法是把这个值和 front 进行比较,相等则出栈。
struct Myqueue {
deque<int> deq;
Myqueue() {}
void push(int x) {
while (true) {
if (deq.empty()) {
deq.push_back(x);
break;
}
else if (deq.back() >= x) {
deq.push_back(x);
break;
}
else {
deq.pop_back();
}
}
}
void pop() {
deq.pop_front();
}
int front() {
return deq.front();
}
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
Myqueue mq;
int len = nums.size();
vector<int> ans(len-k+1, 0);
for (int i = 0; i < k; i++) {
mq.push(nums[i]);
}
ans[0] = mq.front();
for (int i = 0; i < len-k; i++) {
mq.push(nums[i+k]);
if (nums[i] == mq.front()) {
mq.pop();
}
ans[i+1] = mq.front();
}
return ans;
}