这是我实现了一个O(n)的解决方案滑动窗口对于这个问题的:SPOJ ARRAYSUB:试着滑动窗口算法,不接受
http://www.spoj.com/problems/ARRAYSUB/
#include<stdio.h>
int i,k,n,a[1000001],q[1000001],b[1000001],m=-1;
int main() {
scanf("%d",&n);
for(i=0;i<n;i++){
scanf("%d",&a[i]);
if(m<a[i])
m=a[i];
}
scanf("%d",&k);
if(k==1){
for(i=0;i<n-1;i++){
printf("%d ",a[i]);
}
printf("%d",a[i]);
}else
if(k==n){
printf("%d",m);
}else{
int f=0,r=0; //front, rear
q[r++]=a[0]; //queue
for(i=1;i<n;i++){
if(q[f]<=a[i]){
q[f]=a[i]; //push to front, queue with single element
r=f+1;
}else{
q[r++]=a[i]; //push to rear
}
if(i>=k-1){
b[i-k+1]=q[f]; //write q[f] to answer array
if(r-f==k){ //if size of queue = k, pop first element of queue
f++;
}
while(q[f]<q[f+1] && f+1<r){ //after removal of first elementmove front till q[f]<q[f+1]
f++; //i m not sure about this, but i tried many testcases, this works
}
}
}
for(i=0;i<n-k;i++){
printf("%d ",b[i]);
}
printf("%d",b[i]);
}
return 0;
}
然而,我找不到任何的测试用例,它不会运行,SPOJ只是不接受它:(
的代码是很好的注释。
如果任何人都可以指出一些测试用例或者,指出错误,我会很高兴!
谢谢!
a)决定一个语言。 b)Spoj不明白为什么它不被接受? c)比评论更好的是正确的缩进。 – deviantfan
我同意 - 你要么与C或C++打交道。他们完全不同,所以选择一个。你的代码在我看来像C代码。 – caps
你们是肯定苛刻,我把一个C++标签在那里,很抱歉没有意识到的不便:P – Shivam