c++面試題:判斷陣列是否存在重複元素
阿新 • • 發佈:2019-02-01
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,
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; }