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的一个简单实现:
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; }
相关文章推荐
- C++(后台开发面试题)-判断数组中是否存在重复元素
- 判断数组中是否存在重复的元素
- [2016/12/1]判断是否存在重复元素 -- c++ set的巧妙用法
- (笔试题)如何判断数组中是否存在重复元素
- 判断一个int数组中的元素是否存在重复
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- C++ - 一个非递减数组,下标从0到n,元素的取值范围为从0到n的整数,判断其中是否有重复元素
- 面试题:给定一个长度为N的数组,其中每个元素的取值范围都是1到N。判断数组中是否有重复的数字
- 判断数组是否存在重复元素
- 判断一个int数组中的元素是否存在重复
- 哈希(6) - 判断数组中是否存在重复元素且距离在K之内
- 判断数组中是否存在重复元素
- 使用位图法判断整形数组是否存在重复 (待续)
- N个元素的有序数组A,判断是否有 A[i]=i 存在
- js 判断数组是否有重复元素的几种方式
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 一个数组下标从0到n,元素为从0到n的整数,判断其中是否有重复元素。
- 判断数组是否存在某元素
- 判断数组中是否有存在重复值