解题思路:尺取法可以O(n)完成该题。还用map还过滤掉重复的元素。
#include<cstdio>
#include<cstring>
#include<map>
#include<algorithm>
#include<iostream>
using namespace std;
int s[1000009];
map<int,int> mp;
int main()
{
int n;
//freopen("t.txt","r",stdin);
while(scanf("%d",&n)!=EOF)
{
mp.clear();
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
mp[s[i]]=0;
}
int num=mp.size();
int st=0,ed=0,cnt=0,res=n;
while(1)
{
while(cnt<num&&ed<n)
{
if(!mp[s[ed]])
{
cnt++;
}
mp[s[ed++]]++;
}
if(cnt<num) break;
res=min(res,ed-st);
mp[s[st]]--;
if(!mp[s[st]])
cnt--;
st++;
}
printf("%d\n",res);
}
return 0;
}