就是两个指针表示区间[l,r]的开始与结束然后根据题目来将端点移动,是一种十分有效的做法。适合连续区间的问题
这道意思是一本书有n页,每一页上有一个知识点标号a[i]可能重复,要求选择一个最小的区间使得能够覆盖所有知识点
分析:[l,r]区间推进,统计区间中能够覆盖的知识点数,对于每一个l,r都是满足可以覆盖所有知识点的最小r,处理好区间知识点数的统计就好了
1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <set> 5 #include <algorithm> 6 #include <map> 7 #include <queue> 8 #include<cmath> 9 #include<vector> 10 #define maxn 1000010 11 #define maxm 100010 12 #define mod 1000000000000000000 13 #define INF 0x3f3f3f3f3f 14 using namespace std; 15 int n; 16 int a[maxn]; 17 map<int,int>mp; 18 set<int>num; 19 int main (){ 20 while(scanf("%d",&n)!=EOF){ 21 num.clear(); 22 mp.clear(); 23 for(int i=0;i<n;++i){ 24 scanf("%d",&a[i]); 25 num.insert(a[i]); 26 } 27 int l=0,r=0; 28 int m = num.size(); 29 int cnt=0; 30 int ans=n; 31 while(l<n){ 32 while(r<n&&cnt<m){ 33 if(mp[a[r]]==0){ 34 cnt++; 35 } 36 mp[a[r]]++; 37 r++; 38 } 39 if(cnt<m)break; 40 ans =min(ans,r-l); 41 mp[a[l]]--; 42 if(mp[a[l]]==0){ 43 cnt--; 44 } 45 l++; 46 } 47 printf("%d\n",ans); 48 } 49 50 }