2 条题解

  • 0
    @ 2025-10-8 16:53:41

    解法1(往后看,好懂,推荐):

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    int a[N],b[N];
    //b[i]表示从位置i往后最长连续不同序列的长度 
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        unordered_map<int,int>mp;
        int ans=0;
        for(int i=1,r=0;i<=n;i++)
        {
            while(r+1<=n && !mp[a[r+1]] ) mp[a[++r]]=1;               
    		b[i]=r-i+1;
            ans=max(ans,b[i]);
            
            mp[a[i]]=0;
        }
        printf("%d\n",ans);
        return 0;
    }
    

    解法2(往前看):

    #include<bits/stdc++.h>
    using namespace std;
    const int N=1e6+10;
    int a[N],b[N];
    //b[i]表示从位置i往前最长连续不同序列的长度 
    int main()
    {
        int n;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        unordered_map<int,int>mp;
    	int ans=0;
    	memset(b,0,sizeof(b));
        for(int i=1;i<=n;i++)
        {
            if(mp[a[i]])b[i]=min(b[i-1]+1,i-mp[a[i]]);
            else        b[i]=b[i-1]+1;               
            mp[a[i]]=i;
            ans=max(ans,b[i]); 
        }
        printf("%d\n",ans);
        return 0;
    }
    

    qkw代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define N 1000010
    int a[N];deque<int>q;
    unordered_map<int,bool>mp;
    int main()
    {
        int n,ans=0,sum=0;scanf("%d",&n);
        for(int i=1;i<=n;i++)scanf("%d",&a[i]);
        for(int i=1;i<=n;i++) 
        {
            if(mp[a[i]])while(!q.empty()&&mp[a[i]])ans--,mp[q.front()]=0,q.pop_front();
            mp[a[i]]=1,q.push_back(a[i]);ans++;sum=max(sum,ans);
        }
        printf("%d",sum);
        return 0;
    }
    
    • 0
      @ 2025-10-8 16:53:31

      解法1(往后看,好懂,推荐):

      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e6+10;
      int a[N],b[N];
      //b[i]表示从位置i往后最长连续不同序列的长度 
      int main()
      {
          int n;scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);
          unordered_map<int,int>mp;
          int ans=0;
          for(int i=1,r=0;i<=n;i++)
          {
              while(r+1<=n && !mp[a[r+1]] ) mp[a[++r]]=1;               
      		b[i]=r-i+1;
              ans=max(ans,b[i]);
              
              mp[a[i]]=0;
          }
          printf("%d\n",ans);
          return 0;
      }

      解法2(往前看):
      #include<bits/stdc++.h>
      using namespace std;
      const int N=1e6+10;
      int a[N],b[N];
      //b[i]表示从位置i往前最长连续不同序列的长度 
      int main()
      {
          int n;scanf("%d",&n);
          for(int i=1;i<=n;i++)scanf("%d",&a[i]);
          unordered_map<int,int>mp;
      	int ans=0;
      	memset(b,0,sizeof(b));
          for(int i=1;i<=n;i++)
          {
              if(mp[a[i]])b[i]=min(b[i-1]+1,i-mp[a[i]]);//若a[i]出现过,则分两种情况 
              else        b[i]=b[i-1]+1;                //若a[i]没出现过
              mp[a[i]]=i;
              ans=max(ans,b[i]); 
          }
          printf("%d\n",ans);
          return 0;
      }

      qkw代码:

      #include<bits/stdc++.h>
      using namespace std;
      #define N 1000010
      int a[N];deque<int>q;
      unordered_map<int,bool>mp;
      int main()
      {
      int n,ans=0,sum=0;scanf("%d",&n);
      for(int i=1;i<=n;i++)scanf("%d",&a[i]);
      for(int i=1;i<=n;i++)
      {
      if(mp[a[i]])while(!q.empty()&&mp[a[i]])ans--,mp[q.front()]=0,q.pop_front();
      mp[a[i]]=1,q.push_back(a[i]);ans++;sum=max(sum,ans);
      }
      printf("%d",sum);
      return 0;
      }

      • 1

      *【思维】最长连续无重复子序列的长度[scy]

      信息

      ID
      816
      时间
      200ms
      内存
      128MiB
      难度
      8
      标签
      递交数
      292
      已通过
      42
      上传者