vjudge真好用。。。
一句话的题意:给你一个数组,求无重复元素的最长区间长度。
可以发现:区间越长,重复元素会越多。反之亦然。
直接使用two-pointers就可以求解。
具体实现思路是:先移动右端点直至出现重复元素,然后再移动左端点直至没有重复元素。
复杂度依然十分优美。
PS:这道题没跟数据范围是真的捞,\(N \leq 1000000\)。
代码:
#include<cstdio>
#include<map>
#include<algorithm>
const int maxn = 1000005;
int a[maxn], n;
int ans;
int read()
{
int ans = 0, s = 1;
char ch = getchar();
while(ch > '9' || ch < '0'){ if(ch == '-') s = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9') ans = (ans << 3) + (ans << 1) + ch - '0', ch = getchar();
return s * ans;
}
void two_pointers()
{
int l = 1, r = 0;
ans = 0;
std::map<int,int> mmp;
while(r <= n)
{
mmp[a[r]]++;
if(mmp[a[r]] == 2)
{
while(l <= n)
{
mmp[a[l]]--;
l++;
if(mmp[a[r]] == 1)
{
ans = std::max(ans, r - l + 1);
break;
}
}
}
else ans = std::max(ans, r - l + 1);
r++;
}
}
int main()
{
int T = read();
while(T--)
{
n = read();
for(int i = 1; i <= n; i++) a[i] = read();
two_pointers();
printf("%d\n", ans);
}
return 0;
}