链接: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;
}

alt

方法二:

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;
}

一个小插曲(小细节): alt alt

在第一种方法中,初始化最大值max不能为-1,而是要设为1;

原因:.size()是无符号数,与-1比较大小时,-1会转化为无符号数(34294967295),

比0的无符号数(0)大;