在数组/整数列表中查找重复项

时间:2016-07-15 01:03:57

标签: python arrays algorithm list sorting

给定array/list integers,输出重复项。

此外,我真正想要的是:哪些解决方案具有最佳时间性能?最好的空间表现?是否有可能同时拥有最佳时间和最佳空间性能?只是好奇。谢谢!

例如:给定列表[4,1,7,9,4,5,2,7,6,5,3,6,7],答案为[4,7,6,5](输出的顺序无关紧要)。

我在python中写了我的解决方案。

这是我使用哈希和二进制搜索编写的一个解决方案。

def binarySearch(array, number):
    start = 0
    end = len(array)
    mid = (end + start) // 2
    while (end > start):
        mid = start + (end - start) // 2
        if array[mid] == number:
            return (mid, True)
        elif number > array[mid]:
            if start == mid:
                return (mid + 1, False)
                start = mid
            else:
                end = mid

    return (mid, False)

def findDuplicatesWithHash(array):
    duplicatesHash = {}
    duplicates = []
    for number in array:
        try:
            index,found = binarySearch(duplicates, number)
            if duplicatesHash[number] == 0 and not found: 
                duplicates.insert(index, number)
        except KeyError as error:
            duplicatesHash[number] = 0

    duplicatesSorted = sorted(duplicates, key=lambda tup: tup)
    return duplicatesSorted

3 个答案:

答案 0 :(得分:2)

获取副本的一种方法:

l = [4,1,7,9,4,5,2,7,6,5,3,6]
import collections

print([item for item, count in collections.Counter(l).items() if count > 1])

答案 1 :(得分:1)

查找重复项与排序非常相似。也就是说,每个元素需要直接或间接地与所有其他元素进行比较,以找出是否存在重复。可以修改快速排序以输出具有相邻匹配元素的元素,其具有O(n)空间复杂度和O(n * log(n))平均时间复杂度。

答案 2 :(得分:1)

查找重复项有多种解决方案。鉴于此问题是完全通用的,可以假设给定n值列表,重复数量位于[0, n/2]范围内。

您可以想到哪些可能的方法?

  1. 哈希表方法:

    如果值已经不存在于哈希表中,则在遍历列表时存储值。如果值存在,则表示您有重复。

    Algorithm FindDuplicates(list)
    hash_table <- HashTable()
    duplicates <- List()
    for value in list:
        if value in hash_table:
            duplicates.add(value)
        else:
            hash_table.add(value, true)
    
    • 时间:O(n)遍历所有值
    • 空格:O(n)以保存哈希表中的所有可能值。
  2. 排序数组

    对数组进行排序并遍历邻居值。

    Algorithm FindDuplicates(list)
    list.sort()
    duplicates <- Set()
    for i <- [1, len(list)-1]:
        if list[i] = list[i-1]:
            duplicates.add(list[i])
    
    • 时间:O(n.logn) + O(n) = O(n.logn)排序和遍历所有值
    • 空格:O(1)因为没有创建额外的空间来制作重复项
  3. 检查每个值

    对于每个值,检查数组中是否存在该值。

    Algorithm Search(i, list):
        for j <- [0, len(list)-1] - [i]:
            if list[j] = list[i]:
                return true
        return false
    
    Algorithm FindDuplicates(list)
    duplicates <- Set()
    for i <- [1, len(list)-1]:
        if Search(i, list):
            duplicates.add(list[i])
    

    时间:O(n^2)比较次数为n*n(-1) 空格:O(1)因为没有创建额外的空格来制作重复项

  4. 注意:复制数组的空间不能包含在空间复杂度方程中,因为这是我们想要的结果。

    你能想到更多吗?