题目大意
给定一个正整数 n n n 和一个长度为 n n n 的整数数列 a a a。
是否存在一个 a a a 的非空子数组,使得该数组存在重复值。如果存在这样的子数组,则查找此类子数组中最短的子数组的长度。
思路
显然满足条件的最短的子数组,首尾元素必须相同。如果存在首尾不同但满足条件的子数组可以通过删除首尾两边的元素使得它成为首尾元素相同的且更短的子数组。
因此需要一个数组
b
j
bj
bj 来记录
a
i
a_i
ai 前一次出现的位置。如果找到相同的就取
a
n
s
=
min
(
a
n
s
,
i
−
b
j
a
i
+
1
)
ans=\min(ans,i-bj_{a_i}+1)
ans=min(ans,i−bjai+1) 即可。
代码
#include<bits/stdc++.h>
using namespace std;
int n,ans=1e9,a[1000005],bj[1000005];
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(bj[a[i]]!=0){
ans=min(ans,i-bj[a[i]]+1);
}
bj[a[i]]=i;
}
if(ans!=1e9) cout<<ans;
else cout<<-1;
return 0;
}