版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
题意:求最长无重复元素的区间长度
思路:这类问题常见的做法就是尺取法,即不断推进左右区间端点,对于本题来说,如果右端点有重复元素出现,我们必须推进左端点,因为继续推进右端点还是会有重复元素出现。
本题的又一特征是数的大小在本题是无用的,我们只需要明确数的相对大小即可,这正符合离散化的特征,我们可以对数使用离散化,这样我们就可以使用数组进行数的标记,标记是否出现。当然使用map也是可以的,只是map(这也是STL的特点)对于内存的消耗是很大的。
总之,尺取法的用处还是很大的,两个指针的推进对于区间问题的解决是效率很高的。对于尺取法的使用也是很灵活的。
cin和scanf千万别混用,会T~
#include<bits/stdc++.h>
using namespace std;
const int Maxn=1e6+10;
const int inf=0x3f3f3f3f;
int t,n,a[Maxn],b[Maxn],flag[Maxn];
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
}
sort(b+1,b+1+n);
int cnt=unique(b+1,b+1+n)-b-1;
for(int i=1;i<=n;i++) a[i]=lower_bound(b+1,b+1+cnt,a[i])-b;
int ans=1;
int l=1;int r=2;
flag[a[1]]++,flag[a[2]]++;
while(r<=n)
{
while(flag[a[r]]>1)
{
flag[a[l++]]--;
}
ans=max(ans,r>n?r-l:r-l+1);
flag[a[++r]]++;
}
cout<<ans;
}