- 题目
暴力方式是把每个子数组中元素遍历,找出最大值然后记录,时间复杂度为O(n*m)。
利用滑动窗口结构可以做到O(n)。
利用一个双端队列,左右两个值表示窗口两端位置。
如上题要求最大值,则要使队列保持递减。
窗口右边界向后扩:若队列为空则直接从后插入,若不空,则要保证插入元素的值要小于队列的尾部元素,即要从尾部弹出直至可以插入新元素。
窗口左边界向后扩:若队列头所示值为左边界所指的值,则弹出,不是则不操作。
vector<int> getmaxarray(vector<int> array,int windowlen)
{
int len = array.size()-windowlen+1;
vector<int> res;
deque<int> queue;
//int index = 0;
for(int i = 0;i<array.size();i++)
{
while(!queue.empty()&&array[queue.back()]<=array[i])
{
queue.pop_back();
}
queue.push_back(i);
if(queue.front()==i-windowlen)
queue.pop_front();
if(i>=windowlen-1)
res.push_back(array[queue.front()]);
}
return res;
}
int main()
{
vector<int> test = {4,3,5,4,3,3,6,7};
vector<int> res = getmaxarray(test,3);
for(int i = 0;i<res.size();i++)
cout<<res[i]<<" ";
cout<<endl;
return 0;
}