[AcWing]799. 最长连续不重复子序列(C++实现)二维差分模板题
1. 题目
2. 读题(需要重点注意的东西)
思路:
-------------------------------------------------解题思路-----------------------------------------------------------
注:a数组为q数组中的数出现的次数。
- 用两个指针 i , j 来维护一段区间[ i , j ],在这段区间内没有重复的数;
- 首先 i 遍历数组,并把遍历到的数出现的次数加到a[q[i]]中,并计算不重复的数的长度i - j + 1,如果i - j + 1大于当前的res,将其赋值给res。直到找到一个数重复,即a[q[i]]>1;
- 然后j开始后移,移到 i 的位置,并将途径的数从a[]中减去,即a[q[j]]–,j++
-------------------------------------------------代码实现思路-----------------------------------------------------------
- 输入q数组
- 插入模板
- 输出res
3. 解法
---------------------------------------------------解法---------------------------------------------------
#include<iostream>
using namespace std;
const int N = 100010;
int q[N],s[N];
int n;
int main(){
cin >> n ;
for(int i = 0;i < n;i++) scanf("%d",&q[i]);
int res = 0;
for(int i = 0,j = 0; i < n;i++){
s[q[i]] += 1;
while(j < i && s[q[i]] > 1) s[q[j++]] --;
res = max(res,i - j + 1);
}
cout << res << endl;
return 0;
}
4. 可能有帮助的前置习题
5. 所用到的数据结构与算法思想
6. 总结
双指针算法模板,推荐完全背下来。