生成窗口最大值数组
[题目]
有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次
向右边滑一个位置。
例如,数组为[4,3,5,4,3,3,6,7], 窗口大小为3时:
[4 3 5] 4 3 3 6 7 窗口中最大值为5
4 [3 5 4] 3 3 6 7 窗口中最大值为5
4 3 [5 4 3] 3 6 7 窗口中最大值为5
4 3 5 [4 3 3] 6 7 窗口中最大值为4
4 3 5 4 [3 3 6] 7 窗口中最大值为6
4 3 5 4 3 [3 6 7] 窗口中最大值为7
如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口的最大值。
请实现一个函数。
输入: 整型数组arr,窗口大小为w。
输出:一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值
[题目]
有一个整型数组arr和一个大小为w的窗口从数组的最左边滑到最右边,窗口每次
向右边滑一个位置。
例如,数组为[4,3,5,4,3,3,6,7], 窗口大小为3时:
[4 3 5] 4 3 3 6 7 窗口中最大值为5
4 [3 5 4] 3 3 6 7 窗口中最大值为5
4 3 [5 4 3] 3 6 7 窗口中最大值为5
4 3 5 [4 3 3] 6 7 窗口中最大值为4
4 3 5 4 [3 3 6] 7 窗口中最大值为6
4 3 5 4 3 [3 6 7] 窗口中最大值为7
如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口的最大值。
请实现一个函数。
输入: 整型数组arr,窗口大小为w。
输出:一个长度为n-w+1的数组res,res[i]表示每一种窗口状态下的最大值
结果应该返回{5,5,5,4,6,7}。
#include<iostream>
#include<stdio.h>
#include<list>
using namespace std;
template <class T>
int getArrayLen(T& array)
{
return (sizeof(array) / sizeof(array[0]));
}
int* getMaxWindow(int my[], int w)
{
int arr[8];
for(int i = 0; i < 8; i++)
{
arr[i] = my[i];
}
if(w < 1 || (getArrayLen(arr) < w))
{
return 0;
}
list<int> lst;
list<int>::iterator it;
list<int>::iterator it1;
list<int>::iterator it2;
it1 = lst.begin();
it2 = lst.end();
int* res = new int[getArrayLen(arr) - w + 1];
int index = 0;
int ans = 0;
for(int i = 0; i < getArrayLen(arr); i++)
{
it1 = lst.begin();
it2 = lst.end();
if(it1 != --it2)
{
--it2;
}
while((!lst.empty()) && (arr[*it2] != 0) && (arr[*it2] <= arr[i]))
{
lst.pop_back();
}
lst.push_back(i);
it1 = lst.begin();
if((*it1) == (i - w))
{
lst.pop_front();
}
if(i >= (w - 1))
{
it1 = lst.begin();
res[index] = arr[*it1];
index++;
}
}
return res;
}
int main()
{
int w;
cin>>w;
int arr[w] = {0};
for(int i = 0; i < w; i++)
{
cin>>arr[i];
}
int* b = getMaxWindow(arr, 3);
for(int i = 0; i < 6; i++)
{
cout<<b[i]<<" ";
}
return 0;
}