链接:https://ac.nowcoder.com/acm/contest/27269/G 来源:牛客网
方法一:
using namespace std;
int a[10000010];
int main(){
set<int>s;
int n,max=0,f=0;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
if(s.find(a[i])==s.end()){//遍历一遍集合,若没找到a[i]就放进集合里
s.insert(a[i]);
if(s.size()>max)max=s.size();//如果集合的长度大于最大值,就更新最大值
}
else{//遍历一边集合,找到了与当前元素重复的元素
while(f<i){//从上次重复元素的下个位置开始找,找到新的重复元素为止(小于当前位置)
if(a[f]==a[i]){//如果找到了重复元素跳出去
f++;
break;
}
s.erase(a[f]);//把从第一个元素到重复元素之间的元素去掉
f++;
}
}
}
cout<<max;
return 0;
}
方法二:
using namespace std;
int a[10000010],b[10000010];
map<int,int>mp;
int main(){
int n,max=-1,sum=0,k,j;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
for(int i=0;i<n;i++){//第一次出现标记为1
if(mp[a[i]]==0){
sum++;
mp[a[i]]=1;
}
else {
sum=0;
mp.clear();//把重复元素出现位置前的元素标记清零
for(int j=i-1;;j--){//往前找重复元素第一次出现的位置
if(a[j]==a[i]){
i=j;//下次重新查找时从重复元素第一次出现的位置(的下一位(返回循环i++))找
break;
}
}
}
if(sum>max)max=sum;
}
cout<<max;
return 0;
}
一个小插曲(小细节):
在第一种方法中,初始化最大值max不能为-1,而是要设为1;
原因:.size()是无符号数,与-1比较大小时,-1会转化为无符号数(34294967295),
比0的无符号数(0)大;