题目:
分析:
很明确,找一个区间,包含所有的数。
太菜了,只能想到暴力。
说说自己有多菜,暴力统计个数需要每次都遍历查看吗?你难道不会设个双指针吗?
当然啦!直接移动是不行的,需要引入一个cnt来记录双指针之间内部数字的个数。
每次都找到最小区间,然后右指针移动直到有和左指针相同的元素,然后左指针再移动确保是最小的区间。
代码:
#include<bits/stdc++.h>
using namespace std;
int m,n;
int A[1000005];
int cnt[1000005];
int main()
{
cin>>m>>n;
if(n==1)
{
cout<<1<<' '<<1;
return 0;
}
for(int i=0;i<m;i++) scanf("%d",&A[i]);
memset(cnt,0,sizeof(cnt));
int b=0;
int e;
int minn_b,minn_e;
int minn_len=1000005;
set<int> s;
for(e=0;e<m;e++)
{
s.insert(A[e]);
cnt[A[e]]++;
if(s.size()==n)
{
while(cnt[A[b]]!=1)
{
cnt[A[b]]--;
b++;
}
minn_len=e-b;
minn_b=b,minn_e=e;
break;
}
}
for(e++;e<m;e++)
{
cnt[A[e]]++;
if(A[e]==A[b])
{
while(cnt[A[b]]!=1)
{
cnt[A[b]]--;
b++;
}
if(minn_len>e-b) minn_b=b,minn_e=e;
minn_len=min(minn_len,minn_e-minn_b);
}
}
cout<<minn_b+1<<' '<<minn_e+1;
}