检验数组中是否存在重复元素是一个非常常见的问题,存在很多的解决方法,下面将一一介绍各种方法,并在不同的题设要求下给出不同的解决方法,其中包含了很多算法设计思路,相信对学习算法的您会有一定的帮助和启发。
假设一个数组中含有N个元素,其中这N个元素分布在[1,N]的整数,请你判断数组中是否存在重复的元素。
在没有学习hash表之前,我们最容易想到的一个办法就是数组排序,使用堆排序对数组进行排序,然后扫描数组,若存在相邻的两个数组元素相等,则返回此元素,上述算法的时间复杂度为O(nlogn),还算是比较快的算法。
算法的实现如下所示:
int find_a_duplicate_sort(int* a, const int n)
{
heap_sort(a,n);
for(int i=0; i<n-1; i++)
{
if(a[i] == a[i+1])
return a[i];
}
return -1;
}
堆排序的具体实现 堆排序。
但是学习了hash表之后发现上述算法实在是太慢了,我们可以牺牲一定的存储空间来保证算法的时间复杂度下降。如何利用hash表来实现上述功能呢?
首先用数组元素作为hash表的键值对为(数组元素的值,此元素的个数),设计这样的hash表就可以在线性时间内完成上述功能,具体实现如下所示。