一个数字数组,给一个窗口,长度为k,窗口从数组头开始往后滑动,每次滑动一个,求每次窗口中的最大值。例如,数组[3, 4, 5, 7, 3, 5, 2, 9] ,k = 3,那么,输出:5 7 7 7 5 9
#include <iostream>
#include <vector>
#include <iterator>
using namespace std;
struct element{
int value;
int pos;
};
void slide_window(const int* array, int array_size, int window_size, vector<int>& out){
element* tmp= new element[array_size];
tmp[0].value= array[0];
tmp[0].pos =0;
int head=0,tail=0;
for(int i=1; i<window_size; ++i){
while(head <= tail&& tmp[tail].value <array[i]){
--tail;
}
tmp[++tail].value = array[i];
tmp[tail].pos = i;
}
out.push_back(tmp[head].value);
for(int i=window_size; i<array_size; ++i){
while(head <= tail&& tmp[tail].value <array[i]){
--tail;
}
tmp[++tail].value = array[i];
tmp[tail].pos = i;
while(i - tmp[head].pos >= window_size){
++head;
}
out.push_back(tmp[head].value);
}
delete[] tmp;
}
int main(){
int array[]= {3,4,5,7,3,5,2,9};
int array_size = sizeof(array)/sizeof(array[0]);
int window_size = 3;
vector<int> out;
slide_window(array, array_size, window_size, out);
copy(out.begin(), out.end(),ostream_iterator<int>(cout, ""));
cout<< endl;
return-1;
}