3、數組中重複的數字

數組中重複的數字

一:題目描述:

在一個長度爲 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。

Input:
{2, 3, 1, 0, 2, 5}

Output:
2

要求時間複雜度 O(N),空間複雜度 O(1)。

二:思路

因爲要求時間複雜度爲O(N),空間複雜度爲O(1),所以不能夠使用排序算法以及額外的標記數組。
題目爲一個長度n的數組,數據範圍爲0——n-1,那麼我們可以對數組中的數據進行換位,讓數據i放在下標爲i的位置上,即array[i] = i;同時在交換位置是判斷一下,看第i個位置上是否已經有了數值爲i的數據,如果有則證明數據重複。
步驟詳解圖

三:代碼:


public class Demo03 {
  /*
    在一個長度爲 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。
    數組中某些數字是重複的,但不知道有幾個數字是重複的,
    也不知道每個數字重複幾次。

    請找出數組中任意一個重複的數字。

   */

    public static void main(String[] args) {
        int[] array = {2,3,1,0,2,5};
        int rep = findRep(array);
        System.out.println("重複數據爲:"+rep);
    }

    public static int findRep(int[] array){
        //判斷
        if (array == null||array.length<=0){
            return -1;
        }

        for (int i = 0; i < array.length; i++) {
            while (array[i]!=i){
                /*
                判斷一下,如果當交換位置的時候,原來i的位置已經是i了,這時證明找到
                重複數據
                 */
                if (array[i] == array[array[i]]){
                    return array[i];
                }

                /*不相等,那麼將i位置的數據,放入到array[i]位置,
                原本在array[i]位置的數據放入到i位置上
                 */
                swap(array,i,array[i]);
            }
        }
        return -1;
    }

    public static void swap(int[] array,int i, int num){
        int temp = num;
        array[i] = array[num];
        array[num] = temp;
    }
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章