题目链接🔗:4394. 最长连续子序列 - AcWing题库
解题思路:
双指针的思想
开一个数组 用来储存当前区间中每个数字出现的次数
开始将左端点设在0 枚举右端点 判断每次右端点对应的数是否在这个区间中出现过
如果出现过 :数组对应这个数的cnt+=1
如果没出现过 :用来记录一共有几个不同数字的变量tot+=1
判断tot是否大于题目规定的k
若大于 :从左端点开始删数 直到 tot<=k
否则 判断当前状态下左右端点的距离差是否大于之前的最优答案 若是则更新答案
代码:Python3
n,k = map(int,input().split())
nums = list(map(int,input().split()))
cnt = [0 for i in range(10**6+5)]
res_l,res_r = 0,0
l = 0 ; tot = 0
for r in range(n) :
now = nums[r]
if cnt[now] == 0 : tot += 1
cnt[now] += 1
while l < r and tot > k :
head = nums[l]
cnt[head] -= 1
if cnt[head] == 0 : tot -= 1
l += 1
if r-l > res_r-res_l : res_l = l ; res_r = r
print(res_l+1,res_r+1)