采用双向队列维护该滑动窗口,若下一个数值大于当前滑动窗口的最大值,则将双向队列清空并将新值加入;若不大于滑动窗口的最大值,则将尾部小于新值的元素全部出队列;若头部的最大值下标和当前遍历的下标之差大于k时,将头部元素出队列。
/**
*Copyright @ 2019 Zhang Peng. All Right Reserved.
*Filename:
*Author: Zhang Peng
*Date:
*Version:
*Description:
**/
#include<iostream>
#include<vector>
#include<deque>
using namespace std;
vector<int > SlideMax(vector<int > data, int k)
{
vector<int > result;
deque<int > temp;
if (k <= 0)
return result;
else if (k == 1)
return data;
for (int i = 0; i < data.size(); i++)
{
if (temp.empty())
{
temp.push_back(i);
}
else
{
while (!temp.empty() && i - temp.front() >= k)
{
temp.pop_front();
}
if (data[i] > data[temp.front()])
{
temp.clear();
temp.push_front(i);
}
else
{
while (!temp.empty() && data[i] > data[temp.back()])
{
temp.pop_back();
}
temp.push_back(i);
}
}
if (i+1>=k)
result.push_back(data[temp.front()]);
}
return result;
}
int main()
{
vector<int > test = { 2, 3, 4, 2, 6, 2, 5, 1 };
vector<int > result = SlideMax(test, 2);
for (int i = 0; i < result.size(); i++)
cout << result[i] << " ";
cout << endl;
system("pause");
return 0;
}