题意:给定一个数组,求最小的字数组使得数组里存在至少一对重复元素
题解:每个点求出他的后继在哪,然后每次贪心就这个点到他的后继为一个子数组,求出最小的就是答案
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<string> #define ll long long using namespace std; int T,n,ans; int a[200001],nxt[200001],hd[200001]; int main() { scanf("%d",&T); while(T--) { for(int i=1;i<=n;i++)hd[i]=nxt[i]=0; scanf("%d",&n); for(int i=1;i<=n;i++){scanf("%d",&a[i]);nxt[i]=hd[a[i]];hd[a[i]]=i;} ans=1e9; for(int i=1;i<=n;i++)if(nxt[i])ans=min(ans,i-nxt[i]+1); printf(ans==1e9?"-1 ":"%d ",ans); } return 0; }