1. 程式人生 > >找出陣列中任意一個重複出現的數字

找出陣列中任意一個重複出現的數字

一個長度為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;
}