3 回答
TA贡献1789条经验 获得超8个赞
您可以遍历列表,将项目添加到集合中,如果该项目已经在集合中,则它是具有最低索引的重复项,因此您可以简单地返回该项目; 或者如果您到达循环末尾而没有找到重复项,则返回 -1:
def firstDuplicate(a):
seen = set()
for i in a:
if i in seen:
return i
seen.add(i)
return -1
TA贡献1851条经验 获得超4个赞
创建一个新集合并在新列表中找到它,如果它返回元素:
def firstDuplicate(a):
dup = set()
for i in range(len(a)):
if a[i] in dup:
return a[i]
else:
dup.add(a[i])
return -1
TA贡献1993条经验 获得超5个赞
这只是一个想法,我没有验证它,但它应该可以工作。似乎没有内存限制,只有时间限制。因此,使用空间来交易时间可能是一种实用的方法。计算复杂度为O(n)。该算法还取决于数字范围在 1 到 之间的条件len(a)。
def first_duplicate(a):
len_a = len(a)
b = [len_a + 1] * len_a
for i, n in enumerate(a):
n0 = n - 1
if b[n0] == len_a + 1:
b[n0] = len_a
elif b[n0] == len_a:
b[n0] = i
min_i = len_a
min_n = -1
for n0, i in enumerate(b):
if i < min_i:
min_i = i
min_n = n0 + 1
return min_n
更新:
此解决set()方案不如@blhsing的解决方案快。但是,如果它是用 C 实现的,可能就不一样了——这有点不公平,因为它set()是一个内置函数,它是用 C 实现的,作为 CPython 的其他核心函数。
添加回答
举报