如果有多个重复元素,如何在数组中找到重复项?
当数组只有一个重复元素时(例如: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)时间内解决这个问题?
答案 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)
时间。