首页 > 试题广场 >

【模板】双指针

[编程题]【模板】双指针
  • 热度指数:328957 时间限制:C/C++ 4秒,其他语言8秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
\hspace{15pt}对于给定的长度为 n 的数组 \{a_1,a_2,\dots,a_n\} ,找出最长的区间,满足区间中元素两两不同
\hspace{15pt}如果有多个这样的区间,依次输出它们。

输入描述:
\hspace{15pt}第一行输入一个整数 n \left( 1 \leqq n \leqq 2 \times 10^5\right) 代表数组中的元素数量。
\hspace{15pt}第二行输入 n 个整数 a_1,a_2,\dots,a_n \left( 0 \leqq a_i \leqq n \right) 代表初始数组。


输出描述:
\hspace{15pt}第一行输出一个整数 m \left( 1 \leqq m \leqq n \right) 代表满足条件的区间数量。
\hspace{15pt}此后 m 行,每行输出两个整数 l,r \left( 1 \leqq l \leqq r \leqq n \right) 代表满足条件的区间。本题没有 \sf SPJ ,请按照 l 递增的顺序输出。
示例1

输入

6
1 1 4 5 1 4

输出

3
2 4
3 5
4 6
a = int(input())
b = input().split(' ')
if a != len(b):exit()
# import random
# b = [random.randint(1,999) for _ in range(9999)]
数量 = 0
区间列表 = []
列表 = list()

for 索引,值 in enumerate(b):
    if 值 in 列表:
        列表 = 列表[列表.index(值)+1:] + [值]
    else:
        列表.append(值)

    if len(列表) > 数量:
        数量 = len(列表)
        区间列表 = [(索引-len(列表)+2,索引+1)]
    elif len(列表) == 数量:
        区间列表.append((索引-len(列表)+2,索引+1))
    # print(索引,值,列表,数量,区间列表)

print(len(区间列表))
for x,y in 区间列表:
    print(fr'{x} {y}')

自己电脑测试秒过,提交却显示超时。也许用更好的数学方***有所改善。





发表于 2025-08-27 22:47:55 回复(0)