题意:给出 n个数,找到尽量长的一个序列,使得该序列中没有重复的元素
思路:对于该类段查找问题可以采用经典的滑动窗口方法,即维护一个窗口,窗口的左右边界用两个变量L,R代表,先增加R直到出现重复数字,再增加L,再增加R,直到R达到n
滑动窗口 求解;
当右端碰到有相同的数的时候,左端向右滑动一位数
sample:
一、set 数据结构(将窗口内的数字动态存储在set里,然后进行判重即可,当窗口L增加时,在set中删除该元素即可)代码如下:
1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 6 const int maxn=1000000+5; 7 int a[maxn]; 8 9 int main(){ 10 set<int> s; 11 int cases, n; 12 cin >> cases; 13 14 while(cases--){ 15 cin >> n; 16 for(int i=0;i<n;i++) cin >> a[i]; 17 18 s.clear(); 19 int left=0, right=0, ans=0; 20 while(right < n){ 21 while(right < n && !s.count(a[right])) s.insert(a[right++]); 22 ans = max(ans, right-left); 23 s.erase(a[left++]); 24 } 25 cout << ans << endl; 26 } 27 return 0; 28 }
二、利用数组pre[i]表示第i个数的最近一个重复数的位置,初始值设为-1,这里需要开一个辅助数组,在扫描过程中维护该数组的数据并生成pre[i]数组,T[i]表示数字i扫描到当前的最大下标,由于本题数字规模较大,难以开下T[]数组,所以我们利用map代替,代码如下:
1 数组模拟也可,占坑,,,