1. 程式人生 > >c++面試題:判斷陣列是否存在重複元素

c++面試題:判斷陣列是否存在重複元素

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的陣列,元素取值範圍為1N,要求快速判斷是否存在重複元素。

解決方法:

1, 最直觀的解法:兩兩比較陣列元素,但是複雜度為o(n2)

2, 優化版1:先對陣列排序,然後比較相鄰的元素是否相等或判斷陣列元素值是否與其下表相等;該方法時間複雜度依賴於排序演算法一般為o(nlgn)

3, 

優化版2:利用hash,建立一個大小為Nhash表,遍歷陣列,出現的元素在hash表中標記為1,若某個元素已經為1則有重複;為了減少空間可以把hash表替換為bitmap;該方法時間複雜度為o(n)

4, 優化版3:如果N個元素的範圍都是在1N,所以如果沒有重複元素,則每一個位置恰好可以對應陣列中的一個元素之,通過將當前元素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;
}