私はspoj http://spoj.pl/problems/ARRAYSUBでこの問題を解決しようとしていました
2つのアプローチを使用して解決しました
まず、最適化されたブルート フォースを使用します。次に、k、2k、3k などでピボットを取り、最大値を見つけます。
最悪の場合、両方のソリューションが受け入れられますが、複雑さは O(n*k) です。
誰でも O(n) ソリューションを提案できますか 問題に対するアプローチ .
以下は、最悪のケースの複雑さ O(n*k) の私の Running Accepted コードです。
#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);
}