题意:一本书有P页,每一页都一个知识点,求去最少的连续页数覆盖所有的知识点。
思路:用map存储对应的知识点的数量来判断sum是否加或减,用set存储不重复的知识点,然后尺取~
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<string>
#include<vector>
#include<stack>
#include<bitset>
#include<cstdlib>
#include<cmath>
#include<set>
#include<list>
#include<deque>
#include<map>
#include<queue>
using namespace std;
#define inf 0x3f3f3f3f
#define ll long long
const int maxn=200005;
const double eps=1e-8;
const double PI = acos(-1.0);
#define lowbit(x) (x&(-x))
map <int,int> M;
set<int> s;
int a[1000005];
int main()
{
int n;
while(cin>>n)
{
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
s.insert(a[i]);
}
int num=s.size(),l=0,r=0,sum=0,ans=inf;
while(1)
{
while(r<n&&sum<num)
{
if(M[a[r++]]++==0)
{
sum++;
}
}
if(sum<num)
{
break;
}
ans=min(r-l,ans);
if(--M[a[l++]]==0)
{
sum--;
}
}
cout<<ans<<endl;
}
return 0;
}