滑动窗口最大值
题目解答
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
class Solution {
public:
class MyQueue {
public:
void pop(int value) {
if (!que.empty() && que.front() == value) que.pop_front();
}
void push(int value) {
while (!que.empty() && value > que.back()) que.pop_back();
que.push_back(value);
}
int front() {
if(!que.empty()) return que.front();
return -1;
}
private:
deque<int> que;
};
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
vector<int> result;
MyQueue que;
for (int i = 0; i < k; i++) que.push(nums[i]);
result.push_back(que.front());
for (int i = k; i < nums.size(); i++) {
que.pop(nums[i - k]);
que.push(nums[i]);
result.push_back(que.front());
}
return result;
}
};
int main() {
vector<int> nums;
int a;
cin >> a;
nums.push_back(a);
while (cin.get() != '\n') {
cin >> a;
nums.push_back(a);
}
int k;
cin >> k;
Solution s;
vector<int> result = s.maxSlidingWindow(nums, k);
for (vector<int>::iterator it = result.begin(); it != result.end(); it++) {
cout << *it << " ";
}
return 0;
}
解题心得
1、首先该题目不简单,看卡哥的题解之后,发现还要自己创造一个队列(实在是想不到)。
2、该题目要用滑动窗口遍历数组将数组中在滑动窗口中的最大值找出来。那么如何去找呢?就是要使用以deque为基础的队列。
- 该队列的push基础是只要是插入的元素的前面有比他小的元素,那么就将比他小的元素给pop掉,然后将该元素给push进来。
- pop的基础是只有和对应的队尾元素相等时才将该元素给pop掉。