題目 一個大小為n的數組,里面的數都屬於范圍[0, n-1],有不確定的重復元素,找到至少一個重復元素,要求O(1)空間和O(n)時間。 思路一 尋找重復元素,很容易想到建立哈希表來完成,遍歷一遍數組就可以將每個元素映射到哈希表中。
題目
一個大小為n的數組,里面的數都屬於范圍[0, n-1],有不確定的重復元素,找到至少一個重復元素,要求O(1)空間和O(n)時間。
思路一
尋找重復元素,很容易想到建立哈希表來完成,遍歷一遍數組就可以將每個元素映射到哈希表中。如果哈希表中已經存在這個元素則說明這就是個重復元素。這種方法可以很方便的在O(n)時間內完成對重復元素的查找。可是題目要求在O(1)的空間。因此采用哈希表這種解法肯定在空間復雜度上是不符合要求的。題目中數組中所以數字都在[0, n-1]區間范圍內,因此哈希表的大小為n。因此我們實際要做的就是對n個范圍為0到n-1的數進行哈希,而哈希表的大小剛好為n。對排序算法比較熟悉的同學不難發現這與一種經典的排序算法(基數排序)非常類似。而基數排序的時間空間復雜度剛好符合題目要求。因此嘗試使用基數排序來解這道面試題。


#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;
}
};
