该题难在对双向队列的应用,以及对队列元素的额处理
#include<deque>
#include<vector>
#include<iostream>
using namespace std;
//方法一:暴力求解发,时间复杂度为k*n,或logk* n 大顶堆(省略)
//方法二:双向队列法
class Solution {
public:
vector<int> maxSlidingWindow(vector<int>& nums, int k) {
deque<int> dque;
vector<int> output;
//Create and init deque
for (int i = 0; i < k; ++i) {
CleanDQueue(dque, i, k, nums);
dque.push_back(i);
}
//output数组中第一个入栈元素
output.push_back(nums[dque.front()]);
//滑框依次滑过后面n-k个元素
for (int i = k; i < nums.size(); ++i) {
CleanDQueue(dque, i, k, nums);
dque.push_back(i);
output.push_back(nums[dque.front()]);
}
return output;
}
void CleanDQueue(deque<int>& dque, int i,int k, vector<int>& nums) {
//判断是否删除队列头元素,滑框已滑出的元素
if (!dque.empty() && dque.front() == i - k) {
dque.pop_front();
}
//删除所有比即将插入元素要小的现有元素
while (!dque.empty() && nums[dque.back()] < nums[i]) {
dque.pop_back();
}
}
};
//方法三:动态规划DP法,可以参考中文版答案答案