繁体   English   中英

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

[英]Find duplicates in a array/list of integers

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

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

例如:给出清单[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

获取副本的一种方法:

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])

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

有多种解决方案可以找到重复项。 鉴于此问题是完全通用的,可以假设给定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)因为没有创建额外的空间来产生重复

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

你能想到更多吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM