找出陣列中任意一個重複出現的數字
阿新 • • 發佈:2019-01-09
一個長度為n的陣列arr,陣列元素範圍為0到n-1,陣列中沒有重複或者有一個或多個重複,如果有重複輸出任意一個重複的,無重複輸出-1。
思路1:時間複雜度O(n),空間複雜度O(n)
使用雜湊表的原理,重新定義一個n長的陣列table(預設值全部為0),遍歷陣列arr,當table[arr[i]] == 0的時候,說明arr[i]第一次出現,否則出現重複。
思路2:時間複雜度O(n),空間複雜度O(1)
對原來的陣列進行排序,使用普通常見的排序方法時間複雜度最好的是O(nlogn),但是該陣列比較特殊,範圍為0 — n-1,所以每次都可以將一個數字放到排好序的位置上,比如i,會放在arr[i]上。遍歷陣列arr,當arr[i] == i 的時候,說明arr[i]就放在最終位置上,遍歷下一個。當不相等的時候,在判斷arr[i] == arr[arr[i]],如果相等,則arr[i]重複出現,不相等則交換arr[i] 和 arr[arr[i]]的值,交換後則原來的arr[i]就放到最終的位置上了。接著重複處理新的arr[i]。遍歷完,則沒有重複出現的數字。
程式碼:
public static int solution(int[] arr) { int i = 0; while(i < arr.length) { if(arr[i] == i) { i++; } else{ if(arr[i] == arr[arr[i]]) { //說明arr[i]重複出現 return arr[i]; } else { int temp = arr[i]; arr[i] = arr[arr[i]]; arr[temp] = temp; } } } return -1; }