题意:就是选一段连续的子区间[l,r]使得删除这段区间之后,剩余元素没有重复的,求最短的子区间;
我刚开始这个题是这样想的:
先从左往右找第一个重复的然后停止,再从右往左找重复的然后停止,最后r-l+1;但是案例10,始终过不了,之后我的同学给我举了一个例子来证明我的想法是错的:
比如:
如果按照我的想法去写那么就是4,但是很明显删除2,3只需要两个元素,答案为2,那么我的想法就错了;
所以需要分段去找,意思就是:
那么就应该这样去分段找,找到不用删除的最大值,最后用n-ans,就是答案了;注意:这里需要用map或者set来标记;
通过这样就能求解了;唉,我开头不知道自己错哪里了QAQ;
#include<bits/stdc++.h>
using namespace std;
map<int,int> mm;
const int INF=0x3f3f3f3f;
int main(){
int n,a[2019];
scanf("%d",&n);
for(int i=0;i<n;i++)scanf("%d",a+i);//输入
int ans=-1;
for(int i=-1;i<n;i++){//这里i为-1,是因为要满足这个条件也许是[0,x]区间最短;
mm.clear();
int num=0;
for(int j=0;j<=i;j++){//左边
if(!mm[a[j]])mm[a[j]]=1,num++;
else break;
}
for(int j=n-1;j>i;j--){//右边
if(!mm[a[j]])mm[a[j]]=1,num++;
else break;
}
ans=max(ans,num);//不断更新答案
}
printf("%d\n",n-ans);
return 0;
}