在宽范围的整数数组中查找第一个重复元素?

时间:2013-02-20 05:37:16

标签: java c arrays algorithm data-structures

这个问题与Find the first un-repeated character in a string有关,其中输入是字符数组,我们可以使用大小为256的散列。

但是,如果,

  • 数组中的元素是宽范围的整数,散列可能非常昂贵。

  • 数组包含异构元素,整数或字符,那么hash如何解决这个问题。

我们可以使用蛮力方法扫描每个元素的整个数组,但在最坏的情况下,它需要O(n²)。

还有其他想法吗?

2 个答案:

答案 0 :(得分:1)

离线版:对这样的矢量进行排序:

vector<std::pair<int,int> > data;
for (int i=0;i<orignalVec.size();++i)
    data.push_back( make_pair(originalVec[i] , i ) );

然后扫描矢量,寻找一对第一个值相同且位置值最小的一对。这会得到O(NlogN)

在线版本。使用std::mapO(NlogN)std::unordered_mapO(N))。

  

如果数组中的元素是宽范围的整数,则散列可能非常昂贵。

为什么呢? Hash旨在解决这个问题不是吗?

  

如果数组包含异构元素,整数或字符,那么hash如何解决这个问题。

为每个人写下不同的哈希函数。对于intfloatstd::string等类型,我认为STL内置了哈希值。

对于其元素不支持比较操作的异构容器,哈希是我唯一可以提出的。

答案 1 :(得分:1)

int[] numbers = {1, 5, 23, 2, 1, 6, 3, 1, 8, 12, 3};
Arrays.sort(numbers);

for (int i = 1; i < numbers.length; i++) {
    if (numbers[i - 1] == numbers[i]) {
        System.out.println("Repeated numbers are : " + numbers[i]);
    }
}