2 条题解
-
0
解法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
解法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
信息
- ID
- 816
- 时间
- 200ms
- 内存
- 128MiB
- 难度
- 8
- 标签
- 递交数
- 292
- 已通过
- 42
- 上传者