【问题标题】:How to get duplicates in sorted list with O(n) python如何使用 O(n) python 在排序列表中获取重复项
【发布时间】:2022-07-18 20:17:51
【问题描述】:

听说我有一个列表,我必须从中获取重复项。所以我可以使用这样的解决方案:

arr = [1, 1, 2, 3, 4, 4, 5]

def get_duplicates(arr):
    duplicates = []
    for index in range(len(arr)-1):
        if arr[index] == arr[index+1]:
        duplicates.append(arr[index])
    return duplicates

print(*duplicates)

好的,如果我的列表中有三个或更多重复项怎么办?我做了这样的事情:

arr = [1, 1, 1, 2, 3, 4, 4, 4, 4, 5]

def get_duplicates(arr):
    duplicates = []
    for index in range(len(arr)-1):
        if arr[index] == arr[index+1]:
        duplicates.append(arr[index])
    return duplicates

print(*set(duplicates))

我的代码是否都适用于 O(n)?我只是不知道python中set()函数的速度是多少,但我认为第一个for循环需要O(n), 如果 set() 需要 O(n),那没关系,因为在这种情况下,最后我将有 O(2n) = O(n)。

我是否正确解决了该任务,或者我的代码无效?聪明的人,请帮助我)) 如果你知道如何在正确的方向上做,请解释一下。

  • 原代码没有找到不相邻的重复;您没有说明是否可能出现此类重复。
  • 我正在使用 set,因为我只需要从我的列表中获取重复项。如果我只使用不带循环的集合,我将从 [1,1,2,3,4,4,5] -> [1,2,3,4,5] 获得,但我最终需要获得 1,4
  • 我将始终有相邻的重复项,因为我的列表总是在条目时排序。我永远不会得到 [1,2,1,2,3,3,4]。在排序列表中将始终是 [1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,5] 重复项始终相邻。
  • 被排序的列表最好包含在问题中。
  • 您的代码(特别是 if 的正文)没有正确缩进。

标签: python-3.x list duplicates big-o


【解决方案1】:

这是一个明显为 O(n) 的版本:

def get_duplicates(arr):
    last_duplicate = None
    duplicates = []
    for i,v in enumerate(arr[1:]):
        if v==arr[i-1] and v!=last_duplicate:
            duplicates.append(v)
            last_duplicate = v
    return duplicates

请注意,与您的原始代码一样,这假设重复项将彼此相邻。它还假设第一个副本不是None

【讨论】:

  • 谢谢,我可以问你,关于 append() 方法你能说什么?我的意思是,它得到了多少次 - O(1),O(n)? for 循环中的 append 方法不会将我们的大 O 增加到 O(n^2)?或者在这种情况下追加无关紧要
猜你喜欢
  • 1970-01-01
  • 2016-11-10
  • 1970-01-01
  • 1970-01-01
  • 2012-05-22
  • 2017-01-19
  • 2013-01-17
  • 2011-05-08
相关资源
最近更新 更多