a=[2, 1, 3, 5, 3, 2]
def firstDuplicate(a):
for i in range(0,len(a)):
for j in range(i+1,len(a)):
while a[i]==a[j]:
num=[j]
break
print(num)
print(firstDuplicate(a))
输出应该是4和5,但只能是4
答案 0 :(得分:1)
您可以find the indices of all duplicates in an array in O(n) time and O(1) extra space使用以下内容:
def get_duplicate_indices(arr):
inds = []
for i, val in enumerate(arr):
val = abs(val)
if arr[val] >= 0:
arr[val] = -arr[val]
else:
inds.append(i)
return inds
get_duplicate_indices(a)
[4, 5]
请注意,这将修改数组!如果要保持输入数组不变,请将上面的前几行替换为:
def get_duplicate_indices(a):
arr = a.copy() # so we don't modify in place. Drawback is it's not O(n) extra space
inds = []
for i, val in enumerate(a):
# ...
从本质上讲,这使用数组中每个元素的 sign 来指示以前是否看到过数字。如果我们遇到一个负值,则意味着我们已经看到过到达的数字,因此我们将该数字的索引附加到我们已经看到的索引列表中。
请注意,如果数组中的值大于数组的长度,则可能会遇到麻烦,但是在这种情况下,我们只是将工作数组扩展为与输入中的最大值相同的长度。容易。
答案 1 :(得分:0)
您的代码有些错误。以下将收集每个第一个重复项的索引:
def firstDuplicate(a):
num = [] # list to collect indexes of first dupes
for i in range(len(a)-1): # second to last is enough here
for j in range(i+1, len(a)):
if a[i]==a[j]: # while-loop made little sense
num.append(j) # grow list and do not override it
break # stop inner loop after first duplicate
print(num)
当然,还有更多高性能算法可以实现这一点,而不是二次方。