方案三:双端队列实现。由于方案二中实现的步骤比较复杂,所以我们换了一种思路,在取得最大值的过程中,我们并不把每个数值都存入队列,而只是把有可能成为最大值的数据存入到两端开口的队列(deque)中,上面的输入为例,其求解过程如下:
![《剑指offer》:[65]滑动窗口的最大值](http://p1.codesocang.com/uploads/allimg/c160630/14C2DQ63HF-12559.jpg)
#include <iostream>
#include <vector>
#include <deque>
using namespace std;
int arr[8]={2,3,4,2,6,2,5,1};
vector<int> array(arr,arr+8);
deque<int> index;
vector<int> maxWindows;
vector<int> GetmaxInWindows(const vector<int> &data,int size)
{
if(data.size()>=size && size>=1)
{
for(int i=0;i<size;i++) //前三个入队并找出最大的值;
{
while(!index.empty() && data[i]>=data[index.back()])
index.pop_back();
index.push_back(i);
}
for(int i=size;i<data.size();i++)
{
maxWindows.push_back(data[index.front()]);//将最大值如队列;
while(!index.empty() && data[i]>=data[index.back()])
index.pop_back();
if(!index.empty() && index.front()<=(int)(i-size))
index.pop_front();//最大的值已经从窗口滑出了;
index.push_back(i);
}
maxWindows.push_back(data[index.front()]);//最后一个数一定是最大的;
}
return maxWindows;
}
int main()
{
vector<int> result;
result=GetmaxInWindows(array,3);
vector<int>::iterator it;
cout<<"滑动窗口的最大值为:";
for(it=result.begin();it!=result.end();it++)
cout<<*it<<" ";
cout<<endl;
system("pause");
return 0;
}
运行结果:
![《剑指offer》:[65]滑动窗口的最大值](http://p1.codesocang.com/uploads/allimg/c160630/14C2DQF5010-2H93.jpg)
热门源码