当存在多个重复元素时,在数组中查找重复项

时间:2013-12-09 08:36:31

标签: algorithm duplicates

如果有多个重复元素,如何在数组中找到重复项?

当数组只有一个重复元素时(例如:1,2,3,4,4,4,5,6,7),这很容易:

int duplicate(int* a, int s)
{ 
    int x = a[0];
    for(int i = 1; i < s; ++i)
    {
        x = x ^ a[i];
    }
    for(int i = 0; i < a[s]; ++i)
    {
        x = x ^ i;
    }
    return x;
}

但是如果输入数组包含多个重复元素(例如:1,2,2,3,3,4,4,4,5,6,7),则上述操作无效。我们如何在O(n)时间内解决这个问题?

2 个答案:

答案 0 :(得分:1)

使用集合是可能的通用解决方案之一。 c ++中的示例:

template <typename T>
void filter_duplicates(T* arr, int length) {
    std::unordered_set<T> set;
    for (int i = 0; i < length; ++i) {
        if (set.count(arr[i]) > 0) {
            // then it's a duplicate
        }
        set.insert(arr[i]);
    }
    // the set contains all the items, unduplicated
}

由于unordered_set是作为哈希表实现的,因此插入和查找具有分摊的常量复杂度。由于集合只能包含唯一键,因此可以有效地重复删除项目。我们最终可以将集合转换回数组。我们还可以使用地图来计算出现次数。

如果数组元素是整数并且最大可能值是已知的,并且相当低,那么可以用简单数组替换该组,如果我们想要计算出现次数,则为布尔值的1或整数的2。

答案 1 :(得分:1)

如果空间无关紧要或最大数量非常低,您可以简单地使用一种位数组,并通过在数字位置设置位来标记所有已发生的数字。

它是一种具有普通(标识)哈希函数的HashSet。 测试并设置成本O(1)时间。