看了很久,发现这道题目应该是有些前提的,以至于我开始一直往错的方向去想,将题目大大复杂化了 在csdn上看了许多博客文章,终于在看到12235这道例题的答案是235才恍然大悟,反应过来。 这题很简单一直被连续(类似12345)再不重复所误导。实际上是连续不出现重复的序列(前提) 那么知道了前提,我们就讲下解题思路吧! 首先需要知道本题是双指针思想:有一个i指针和一个j指针。i指针遍历整个序列(一直走在前面),我们把其称为快指针;j指针用来标记连续不重复子序列最前面的下标, 我们把其称为慢指针。快指针i不断前进,将每个数字存入对应的列表对应的位置s(s[i]表示数字s[i]出现的频率),快指针i每次移动一次更新res(最长连续不重复子序列长度)。当出现s[i]大于1,表示当前i下标和i-1位置出现重复,s[i]==s[i-1]。此时快指针i停止向前移动,慢指针需要移动当前位置,去掉重复,也就是s[q[j]]-=1,将出现重复之前的所有以经添加的数据删除,重新开始计算最长连续不重复子序列区间。
题目:
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。
输入格式
第一行包含整数n。
第二行包含n个整数(均在0~100000范围内),表示整数序列。
输出格式
共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。
数据范围
1≤n≤100000
输入样例:
5
1 2 2 3 5
输出样例:
3
附上python源码:
n=int(input())
# 序列
q=list(map(int,input().split()))
# 各个数字出现的频率序列
s=[0 for i in range(100000)]
res=0 #当前下标前的最长连续不重复序列的长度
i=0
j=0
while i<n:
s[q[i]]+=1
while j<i and s[q[i]]>1:#出现重复
s[q[j]]-=1 #因为出现重复,目的是为了让指针j移动至指针i,将重复之前的所有已添加的数据去除,重新开始计算最长连续不重复子序列区间
j+=1
res=max(res,i-j+1)
i+=1
print(res)
15.最长连续不重复子序列 - haust_fx - 博客园 (cnblogs.com)https://www.cnblogs.com/fx1998/p/12824375.html