您的位置:首页 > 编程语言 > C语言/C++

c++面试题:判断数组是否存在重复元素

2014-05-22 23:09 621 查看
Problem:

given an array in length of N, in which theelements are integers distributed from 1 to N, please judge whether there isduplication quickly.

即一个长度为N的数组,元素取值范围为1到N,要求快速判断是否存在重复元素。

解决方法:

1, 最直观的解法:两两比较数组元素,但是复杂度为o(n2)。

2, 优化版1:先对数组排序,然后比较相邻的元素是否相等或判断数组元素值是否与其下表相等;该方法时间复杂度依赖于排序算法一般为o(nlgn)。

3, 优化版2:利用hash,创建一个大小为N的hash表,遍历数组,出现的元素在hash表中标记为1,若某个元素已经为1则有重复;为了减少空间可以把hash表替换为bitmap;该方法时间复杂度为o(n)。

4, 优化版3:如果N个元素的范围都是在1到N,所以如果没有重复元素,则每一个位置恰好可以对应数组中的一个元素之,通过将当前元素k交换到其本身应该在的位置k,也就是k=array[i],array[array[i],并判断是否存在duplication或者已经就绪。时间复杂度O(N),空间复杂度O(1);但是该方法需要修改原数组。

下面给出方法4的一个简单实现:

bool hasDup(int A[], int n){
for(int i = 1; i < n; ++i){
while(A[i] != i){
int idx = A[i];
if(A[i] == A[idx])
return true;
swap(A[i], A[idx]);
}
}
return false;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: