题意就是 在P张书页中 其中有重复元素 选取最小连续区间内包括了这期间的所有不同的数 求符合条件的最小区间长度
本题可以用尺取法
所谓尺取 就是选取两个下标 s e 分别指向当前扫面区间的首尾
开始赋值都是1 然后分析数串 把e向后移 找到一种符合条件的区间后再把s向后移不断判断是否符合条件 更新长度
不满足所需e向后 满足所需 s 向前求得最小长度
本题由于要表示数据删除 由于数在区间内不一定只是1个所以删除时用map来表示数量变化 直到该元素在map中值为0时再彻底删除
code:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<map>
#include<set>
using namespace std;
typedef long long ll;int p[1000010];
int main()
{int n;ios::sync_with_stdio(0);cin>>n;set<int>a;for(int i=1;i<=n;i++){cin>>p[i];a.insert(p[i]);}int all = a.size();map<int,int>res;int se=1,en=1;int ans =1000010;int sum=0;while(1){while(en<=n&&sum<all){if(res[p[en++]]++==0)sum++;}if(sum<all)break;ans = min(en-se,ans);if(--res[p[se++]]==0)sum--;}cout<<ans<<endl;return 0;
}