目录
  1. 1. 最长连续不重复子序列
    1. 1.1. 题目描述
    2. 1.2. 题目分析
    3. 1.3. 代码实现
    4. 1.4. 总结
最长连续不重复子序列

最长连续不重复子序列

题目描述

给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长度。

输入格式
第—行包含整数n。
第二行包含n个整数(均在$0~100000$范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复数字的连续子序列的长度。

数据范围

$1<=n<=100000$

输入样例

5
1 2 2 3 5

输出样例

3

题目分析

要找寻一个序列中不存在重复数字的区间,就需要判断两个端点,分别是首和尾因此采用双指针来找寻符合要求的区间,通过一个新的数组来对每个出现的数字进行计数以判断是否重复

代码实现

#include<bits/stdc++.h>
const int N = 100010;
using namespace std;

int n;
// 定义整数序列a,与计数序列s
int a[N], s[N];
int main(){
cin >> n;
// 输入序列
for(int i = 0; i < n; i++)
scanf("%d", &a[i]);
int res = 0;
for(int i = 0, j = 0; i < n; i ++){
// 对其出现的数字进行计数
s[a[i]] ++;
// 判断是否重复出现过
while(s[a[i]] > 1){
s[a[j]] --; // 对应的计数 -1
j ++; // 同时后移 j 下标
}
res = max(res, i - j + 1);
}
cout << res << endl;
return 0;
}

总结

双指针的可以方便的找出一个端点和另一个端点,对于找寻区间的问题有个更快的解决方式

文章作者: Jachie Xie
文章链接: https://xjc5772.github.io/2020-09/03/%E7%AE%97%E6%B3%95/%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/%E5%8F%8C%E6%8C%87%E9%92%88/%E6%9C%80%E9%95%BF%E8%BF%9E%E7%BB%AD%E4%B8%8D%E9%87%8D%E5%A4%8D%E5%AD%90%E5%BA%8F%E5%88%97/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 XJC&Blog
打赏
  • 微信
  • 支付宝

评论