题目的意思是:输入长度为N的序列,找到一个尽量长的连续子序列Ai~Aj,使得序列中没有重复的元素。
可以用集合Set来求解。从0号位置开始,一直添加元素进去直到有重复,更新最长子序列的值,去掉最左边的元素,继续添加元素。不断的重复,更新。最终找到最大的子序列。
下面的是AC的代码:
#include <iostream>
#include <cstdio>
#include <set>
#include <algorithm>
using namespace std;
const int maxn = 1000000 + 5;
int A[maxn];
int max(int x, int y)
{
return x > y ? x : y;
}
int main()
{
int T, n;
scanf("%d", &T);
while(T--)
{
scanf("%d", &n);
for(int i = 0; i < n; i++)
scanf("%d", &A[i]);
set<int> s;
int L = 0, R = 0, ans = 0;
while(R < n)
{
while(R < n && !s.count(A[R]))
s.insert(A[R++]);
ans = max(ans, R - L);
s.erase(A[L++]);
}
printf("%d\n", ans);
}
return 0;
}