这个方法就是两个标,一个在后,一个在前,一般都是类似求和满足大于某个数或者怎样的最小个数(目前只会这样的),前面的一直往前走,直到满足条件,然后面的往前走,直到不满足条件。
还有就是set和map真的好用,统计元素出现的个数,可以用set。
附poj 3320代码
1 #include <iostream> 2 #include <cstring> 3 #include <string> 4 #include <map> 5 #include <set> 6 #include <algorithm> 7 #include <fstream> 8 #include <cstdio> 9 #include <cmath> 10 #include <stack> 11 #include <queue> 12 using namespace std; 13 const double Pi=3.14159265358979323846; 14 typedef long long ll; 15 const int MAXN=1000000+5; 16 const ll mod=1e9+7; 17 18 int a[MAXN]; 19 20 set <int> all; 21 map <int,int> cnt; 22 int main() 23 { 24 int p;cin>>p; 25 map <int,int> cnt; 26 for(int i=1;i<=p;i++) 27 { 28 scanf("%d",&a[i]); 29 all.insert(a[i]); 30 cnt[a[i]]=0; 31 } 32 int n=all.size(); 33 int ans=p+1; 34 int s=1,t=1,num=0; 35 while(1) 36 { 37 while(t<=p&&num<n) 38 { 39 if(cnt[a[t]]==0) 40 { 41 num++; 42 } 43 cnt[a[t]]++; 44 t++; 45 } 46 if(num<n) break; 47 ans=min(ans,t-s); 48 if(--cnt[a[s++]]==0) 49 num--; 50 } 51 printf("%d",ans); 52 return 0; 53 }