陣列中重複的數字(1)

2021-09-22 07:54:27 字數 1249 閱讀 2930

題目:找出陣列中的重複數字

在乙個長度為n的陣列裡的所有數字都在0~n-1的範圍內。陣列中某些數字是重複的,但不知道有哪幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者是3。

第一種方法:   暴力解決

對於每乙個數字都掃瞄一遍剩下的所有數字看有沒有重複的。這樣我們的時間複雜率是o(n²)**如下:

for(int i=0;i第二種方法: 排序解決

我們先排序,然後從陣列中找到乙個重複的數字是很容易的,只需要從頭到尾的掃瞄陣列。但是排序乙個長度為n的陣列需要o(nlogn)的時間複雜率,在排序的時候,應該選擇合適的排序方法,對於不同的資料,選擇的排序演算法也不一樣,相對於的時間複雜度和空間複雜度也不一樣。

第三種方法:雜湊表

對於雜湊表,我們從頭到尾的去掃瞄陣列中的每乙個數字,每掃瞄乙個數字的時候,都可以用o(1)的時間表來判斷雜湊表裡是否包含該數字。時間複雜度 o(n),但是他的空間複雜度是o(n);

第四種方法:

從頭到尾的掃瞄這個陣列,掃瞄到下標為i的數字時,首先比較這個數字(用m表示)是不是等於i,如果是,則接著掃瞄下乙個數字;如果不是,則再拿他和第m個數字進行比較;如果是他和第m個數字相等,就找到了第乙個重複的數字;如果不相等它和第m個數字不相等,就把第i個數字和第m個數字交換,把m放到屬於它的位置。

eg:2 ,3 , 1 , 0 , 2 , 5 , 3   比較0號下標  0!=2 交換

1 ,3 , 2 , 0 , 2 , 5 , 3   交換後,比較0號下標,不相等, 交換

3 ,1 , 2 , 0 , 2 , 5 , 3   交換後,比較0號下標,不相等, 交換  

0 ,1 , 2 , 3 , 2 , 5 , 3   交換後,比較0號下標,相等, 比較1號

1 2 3號位的數字相等,看4號位,4號位是2 所以找到了第乙個相同的數字    

時間複雜度o(n)    空間複雜度 o(1)

**:bool duplicate(int numbers,int length,int *duplication)

for(int i=0;ilength-1)

return false

} for(int i=0;iint temp=numbers[i];

numbers[i]=numbers[temp];

numbers[temp]=temp;

} }return false;

}

1 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。從頭到尾依次遍歷陣列,比較下標為i的數字 用m表示 是否等於i。如果...

1 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。返回描述 如果陣列中有重複的數字,函式返回true,否則返回false...

1 找出陣列中重複的數字

方法1 通過構建hashmap,記錄每個值的重複情況。複雜度 o n o 1 class solution mapmap new hashmap for int i 0 i nums.length i else return 1 方法2 由於題目特徵,構建1 n 1的桶 將每個數字放到對應下標的正確...