题意:
找出连续的d个数,输出其中不同数字的最小个数。
思路:
因为每次我们都只要看d个数字就可,而每次我们都只是往后移一位,所以说每次我们删去第一个数字,加入一个数字,在判断不同的个数即可,无需每次都d次循环。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,t,m,k,d;
int a[200001],b[1000001];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d %d %d",&n,&k,&d);
//memset(a,0,sizeof(a));
//memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[a[i]]=0;
}
int min1=k;
int s=0;
for(int i=1;i<=d;i++)
{
if(b[a[i]]==0)
{
s++;
}
b[a[i]]++;
}
min1=s;
for(int i=1;i<=n-d;i++)
{
b[a[i]]--;
if(b[a[i]]==0)
{
s--;
}
if(b[a[i+d]]==0)
{
s++;
}
b[a[i+d]]++;
min1=min(min1,s);
}
printf("%d\n",min1);
}
}