文件 input.txt 由两行组成:第一行有整数 N 个空格,然后是整数 K (1 ≤ N,K ≤ 250000)。Second 有 N 个空格分隔的整数,其中每个整数都小于或等于 K。保证从 1 到 K 的每个整数都在数组中。任务是找到包含所有整数的最小长度子数组。并打印它的开始和结束。请注意,索引从 1 开始。
例子:
Input Output
5 3 2 4
1 2 1 3 2
6 4 2 6
2 4 2 3 3 1
我在最近的一次编程比赛中完成了这项任务。结束了,我没有作弊。我已经使用 python 3 实现了它:
with open('input.txt') as file:
N, K = [int(x) for x in file.readline().split()]
alley = [int(x) for x in file.readline().split()]
trees = {}
min_idx = (1, N)
min_length = N
for i in range(N):
trees[alley[i]] = i
if len(trees) == K:
idx = (min(trees.values())+1, max(trees.values())+1)
length = idx[1] - idx[0] + 1
if length < min_length:
min_idx = idx
min_length = length
if min_length == K:
break
print (str(min_idx[0]) + " " + str(min_idx[1]))
想法是将第 i 个树的最后位置保存到字典中,如果字典包含所有项目,则检查该子数组是否最小。
第 16 次测试表明我的算法超过了时间限制,即 1 秒。我认为,我的算法是 O(N),因为它在一次跨数组运行中完成,并且映射访问成本 O(1)。
如何加快这一算法的速度?可以降低复杂性还是我对某些需要花费大量时间的 Python 的误解?