-
有一串整数在排队……
有N个整数,你有一个可以框住M个连续段整数的木框,现在你想知道,对于这个队列中任意的连续M个整数,最大和最小的整数是哪个?
例:(M大小的窗口向右滑动)
1 2 3 2 1 M=2
1 2 MAX 2 MIN 1
2 3 MAX 3 MIN 2
3 2 MAX 3 MIN 2
2 1 MAX 2 MIN 1
最后需要输出的是两行:
1 2 2 1
2 3 3 2
#include "stdio.h"
void min(int *A,int num,int k)
{
int head=0;
int tail=-1;
int i=0,j=0;
int *B=(int *)malloc(sizeof(int)*num);
int *C=(int *)malloc(sizeof(int)*num);
for(i=0;i<k-1;i++)
{
while(head<=tail&&A[B[tail]]>A[i])
{
tail--;
}
tail++;
B[tail]=i;
}
for(i=k-1;i<num;i++)
{
while(head<=tail&&A[B[tail]]>A[i])
{
tail--;
}
++tail;
B[tail] =i ;
while(head<=tail&&B[head]<=i-k)
{
head++;
}
C[i-k+1] = A[B[head]] ;
j++;
}
for(i=0;i<j-1;i++)
{
printf("%d ",C[i]);
}
printf("%d\n",C[i]);
free(B);
free(C);
}
void max(int *A,int num,int k)
{
int head=0;
int tail=-1;
int i=0,j=0;
int *B=(int *)malloc(sizeof(int)*num);
int *C=(int *)malloc(sizeof(int)*num);
for(i=0;i<k-1;i++)
{
while(head<=tail&&A[B[tail]]<A[i])
{
tail--;
}
tail++;
B[tail]=i;
}
for(i=k-1;i<num;i++)
{
while(head<=tail&&A[B[tail]]<A[i])
{
tail--;
}
++tail;
B[tail] =i ;
while(head<=tail&&B[head]<=i-k)
{
head++;
}
C[i-k+1] = A[B[head]] ;
j++;
}
for(i=0;i<j-1;i++)
{
printf("%d ",C[i]);
}
printf("%d\n",C[i]);
free(B);
free(C);
}
int main()
{
int testCase;
int num,k;
int i,j;
int *A;
int *B;
scanf("%d",&testCase);
while(testCase--)
{
scanf("%d %d",&num,&k);
A=(int *)malloc(sizeof(int)*num);
for(i=0;i<num;i++)
{
scanf("%d",&A[i]);
}
min(A,num,k);
max(A,num,k);
free(A);
}
return 0;
}