[经典面试题][谷歌]一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素
题目
一个大小为n的数组,里面的数都属于范围[0, n-1],有不确定的重复元素,找到至少一个重复元素,要求O(1)空间和O(n)时间。
思路一
寻找重复元素,很容易想到建立哈希表来完成,遍历一遍数组就可以将每个元素映射到哈希表中。如果哈希表中已经存在这个元素则说明这就是个重复元素。这种方法可以很方便的在O(n)时间内完成对重复元素的查找。可是题目要求在O(1)的空间。因此采用哈希表这种解法肯定在空间复杂度上是不符合要求的。题目中数组中所以数字都在[0, n-1]区间范围内,因此哈希表的大小为n。因此我们实际要做的就是对n个范围为0到n-1的数进行哈希,而哈希表的大小刚好为n。对排序算法比较熟悉的同学不难发现这与一种经典的排序算法(基数排序)非常类似。而基数排序的时间空间复杂度刚好符合题目要求。因此尝试使用基数排序来解这道面试题。
代码
/*---------------------------------------------
* 日期:2015-02-19
* 作者:SJF0115
* 题目: 找重复元素
* 来源:
* 博客:
-----------------------------------------------*/
#include <iostream>
#include <algorithm>
using namespace std;
class Solution {
public:
int IsReplication(int a[],int n){
if(n <= 0){
return -1;
}//if
for(int i = 0;i < n;){
if(a[i] != i){
// 存在重复元素
if(a[i] == a[a[i]]){
return a[i];
}//if
swap(a[i],a[a[i]]);
}//if
else{
++i;
}//else
}//for
return -1;
}
};
int main() {
Solution solution;
int num[] = {6,1,4,7,5,3,6,2};
int result = solution.IsReplication(num,8);
cout<<result<<endl;
}
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。