题目
代码(看解析)
priority_queue优先队列
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
// 优先队列
priority_queue<pair<int, int>> q;
int len = nums.size();
for(int i = 0; i < k; i++) { // 初始化时先把前k个放进去
q.emplace(nums[i], i);
}
vector<int> res;
res.push_back(q.top().first);
// 开始滑动窗口
for(int i = k; i < len; i++) {
q.emplace(nums[i], i);
while(q.top().second <= i - k) {
q.pop(); // 不断地移除堆顶的元素,直到其确实出现在滑动窗口中。
}
res.push_back(q.top().first);
}
return res;
}
};
代码(二刷看解析)
单调队列
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
int n = nums.size();
deque<int> q; // 单调队列,放入下标
for(int i = 0; i < k; i++) { // 初始化操作
while(!q.empty() && nums[i] >= nums[q.back()]) {
q.pop_back();
}
q.push_back(i);
}
vector<int> res;
res.push_back(nums[q.front()]);
for(int i = k; i < n; i++) {
while(!q.empty() && nums[i] >= nums[q.back()]) {
q.pop_back();
}
q.push_back(i); // 先插入
while(q.front() <= i-k) {
q.pop_front(); // 移除窗口之外的
}
res.push_back(nums[q.front()]);
}
return res;
}
};
代码(7.17 三刷看解析)
这一次对优先队列想必会有更深刻的理解了。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
priority_queue<pair<int, int>> q;
for(int i = 0; i < k; i++) {
q.emplace(make_pair(nums[i], i));
}
vector<int> res;
res.push_back(q.top().first);
for(int i = k; i < nums.size(); i++) {
q.emplace(make_pair(nums[i], i));
while(q.top().second <= i - k) {
q.pop();
}
res.push_back(q.top().first);
}
return res;
}
};
单调队列,由于昨天刚刷了单调栈,就比较熟悉了,其实是一样的思路,都是删除队尾元素。
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> q;
vector<int> res;
for(int i = 0; i < k; i++) {
while(!q.empty() && nums[i] >= nums[q.back()])
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[i] >= nums[q.back()])
q.pop_back();
q.push_back(i);
while(i - k >= q.front())
q.pop_front();
res.push_back(nums[q.front()]);
}
return res;
}
};
代码(8.21 四刷自解)
#include <queue>
class Solution {
public:
vector<int> maxInWindows(vector<int>& num, int size) {
vector<int> res;
if(size == 0 || size > num.size())
return res;
deque<int> q;
for(int i = 0; i < size; i++) {
while(!q.empty() && num[q.back()] < num[i]) {
q.pop_back();
}
q.push_back(i);
}
res.emplace_back(num[q.front()]);
for(int i = size; i < num.size(); i++) {
while(!q.empty() && num[q.back()] < num[i]) {
q.pop_back();
}
q.push_back(i);
while(i-q.front() >= size)
q.pop_front();
res.emplace_back(num[q.front()]);
}
return res;
}
};
优先队列,默认大根堆,最大的在队头,即less。
#include <queue>
class Solution {
public:
vector<int> maxInWindows(vector<int>& num, int size) {
priority_queue<pair<int, int>> q;
vector<int> res;
if(!size || size > num.size())
return res;
for(int i = 0; i < size; i++) {
q.emplace(num[i], i);
}
res.emplace_back(q.top().first);
for(int i = size; i < num.size(); i++) {
q.emplace(num[i], i);
while(i - size >= q.top().second)
q.pop();
res.emplace_back(q.top().first);
}
return res;
}
};
代码(9.6 五刷自解)
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
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);
}
vector<int> res;
res.push_back(nums[q.front()]);
for(int i = k; i < nums.size(); i++) {
int num = nums[i];
while(!q.empty() && nums[q.back()] < nums[i])
q.pop_back();
q.push_back(i);
while(i-q.front() >= k) {
q.pop_front();
}
res.push_back(nums[q.front()]);
}
return res;
}
};