我试图在 spoj http://spoj.pl/problems/ARRAYSUB上解决这个问题
我用两种方法解决了它
首先使用优化的蛮力。其次在 k、2k、3k 等处取 Pivot 并找到最大值。
尽管在最坏的情况下两种解决方案都被接受,但复杂度为 O(n*k);
任何人都可以建议解决问题的 O(n) 解决方案。
下面是我的运行接受的最坏情况复杂度 O(n*k) 的代码:
#include<iostream>
#include<cstdio>
#include<climits>
using namespace std;
main()
{
long n;
cin >> n;
long *arr = new long[n];
for( long i=0;i<n;i++)
cin >> arr[i];
long k;
cin >> k;
long max=arr[0];
for(long i=1;i<k;i++)
{
if(arr[i]>max)
max=arr[i];
}
if(k!=n)
cout<<max<<" ";
else cout<<max;
for( long i=k;i<n;i++)
{
if(arr[i-k]==max)
{max=-1;
for(int j=i-k+1;j<=i;j++)
if(arr[j]>max)
max=arr[j];
if(i!=n)
cout<<max<<" ";
else cout<<max;
}
else{
if(arr[i]>max)
{ max=arr[i];
if(i!=n)
cout<<max<<" ";
else
cout<<max;
}
else
{
if(i!=n)
cout<<max<<" ";
else cout<<max;}
}
}
cout<<endl;
return(0);
}