2 回答
TA贡献1810条经验 获得超4个赞
您可以在O(n)时间和O(1)多余空间中找到数组中所有重复项的索引,如下所示:
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):
# ...
从本质上讲,这使用数组中每个元素的符号作为以前是否看到过数字的指示器。如果我们遇到一个负值,则意味着我们已经看过达到的数字,因此我们将数字的索引附加到我们已经看到的索引列表中。
请注意,如果数组中的值大于数组的长度,则可能会遇到麻烦,但是在这种情况下,我们只是将工作数组扩展为与输入中的最大值相同的长度。十分简单。
TA贡献1827条经验 获得超4个赞
您的代码有些错误。以下将收集每个第一个重复项的索引:
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)
当然,还有更多性能算法可以实现这一点,而不是二次方的。
添加回答
举报