给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
5
1 2 2 3 5
输出样例:
3
双指针算法:
先是暴力再进行优化,外循环利用i进行遍历,内循环中的j表示此时离i最远的合法距离,这个j是只能向前跑的。
利用反证法即可;
关于更新(暴力算法优化)
开辟一个新的数组出来存放原始数据中每一个数据出现的次数,也就是打一个标记的样子。当同一数据出现次数大于1,
证明说这个j 需要往前面移动并且s[j]需要--才行,因为我已经此时的j指针指向的那个元素丢掉了
#include <iostream>//头文件结束
using namespace std;//命名空间结束
const int N = 100010;//数据规模大小
int n;
int q[N], s[N];//q:存放原始数据,s[i]:表示以q[i]结束的这一段的最长连续不重复子序列是多少
int main()
{
scanf("%d", &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]] ++ ;//存放q[i]出现的次数
while (j < i && s[q[i]] > 1) s[q[j ++ ]] -- ;//更新情景,最关键的一步
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}