题意:输入长度为n的序列a,找到一个尽量长的连续子序列a[l] - a[r],使该序列中没有相同的元素
紫薯P239
序列元素从0开始编号,l 和 r 分别表示子序列左右端点,初始化为0,固定 l,判断加入 a[r] 是否重复,如不重复,加入,同时r++,若重复,l++,然后再判断加入a[r]是否重复..
时间复杂度:r从0到n,判重由set来处理lgn,总O(nlgn)
1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> 4 #include <set> 5 using namespace std; 6 int main() 7 { 8 int t, n; 9 scanf("%d", &t); 10 while (t--) 11 { 12 scanf("%d", &n); 13 int *a = new int[n]; //动态分配 14 for (int i = 0; i < n; i++) 15 scanf("%d", &a[i]); 16 int l, r, maxL; 17 maxL = l = r = 0; 18 set<int> s; 19 while (r < n) 20 { 21 while (r < n && s.count(a[r]) == 0) //判断加入r是否重复 22 { 23 s.insert(a[r]); 24 r++; 25 } 26 maxL = max(maxL, r - l); 27 s.erase(a[l]); // 将l处的移除set 28 l++; 29 } 30 printf("%d\n", maxL); 31 } 32 return 0; 33 }