本题原题意为寻找数串中一个最长的数据位置相邻且无重复数据的子串的长度
如原数据为:1 2 2 3 5 最终得到的答案是 3.对应的子串为 2 3 5
但最初解题时我对连续的理解与题目原意并不相同 我认为是形如 1 2 3 4 5 的每个数据相差1的子串(可理解为连续数字)
下面给出题目正解及寻找连续数字的变形。
题目:
给定一个长度为 nn 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式:
第一行包含整数 nn。
第二行包含 nn 个整数(均在 0∼1050∼105 范围内),表示整数序列。
输出格式:
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围:
1≤n≤10^5
输入样例:
5
1 2 2 3 5
输出样例(连续子串):3
输出样例(连续数字):2
连续子串
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n,res,q[N],s[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)cin >> q[i];
for(int i = 0,j = 0; i < n; i ++)
{
s[q[i]] ++;
while(s[q[i]] > 1)
{
s[q[j]] --;
j ++;
}
res = max(res,i-j+1);
}
cout << res << endl;
return 0;
}
连续数字
#include<iostream>
using namespace std;
const int N = 1e5 + 10;
int n,q[N];
int main()
{
cin >> n;
for(int i = 0; i < n; i ++)cin >> q[i];
int c = 0;
for(int i = 0;i < n; i ++)
{
int j = i+1;
while(j < n && q[j] == q[j-1]+1)j ++;
if(j-i > c)c = j-i;
i = j-1;
}
cout << c;
return 0;
}