劍指offer 陣列中重複的數字

2021-09-25 12:12:08 字數 1410 閱讀 1165

陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。

陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。

請找出陣列中任意乙個重複的數字。

例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

1.先將陣列進行排序,然後在排序後的陣列中查詢重複的資料,比較容易,只需要從頭到尾掃瞄陣列就行了。但是這個排序陣列的時間複雜度是o(nlogn).

2.使用雜湊表

先遍歷陣列,當掃瞄到乙個數字的時候,都可以用o(1)的時間來判斷雜湊表是否包含了該數字,如果不存在,就加入此數字到雜湊表中。如果存在,就返回;演算法的時間複雜度。是o(n) ,但是以乙個大小為o(n)的雜湊表為代價的

3:基於使用雜湊表的缺點,目標在於空間複雜度在o(1)的演算法。如果這個陣列中沒有重複的資料的話,那麼當陣列排序之後,數字 i 將出現在下標位置為 i 的位置,由於陣列中有重複的數字,有些位置可能存在多個數字,同時,可能某些位置沒有數字

讓我們重排這個陣列,從頭到尾依次掃瞄這個陣列中的每乙個數字。當掃瞄到下標為i的陣列時,首先比較這個數字(a[i])是不是等於 i,如果相等,則接著掃瞄下乙個數字,如果不相等,則再拿它和第(a[i])個位置的數字進行比較,如果此時相等,那麼就找到了乙個重複的數字。如果不相等的話,那就把第i個位置的數字和第a[i] 個數字進行交換,知道找到乙個重複的數字位置。

* 在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。

* 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。

* 請找出陣列中任意乙個重複的數字。

* 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。

* * @author [email protected]

* @date 2023年6月11日 下午7:38:46

*/public class duplicatearray

// 判斷陣列中資料是否滿足條件要求(取值範圍在0-n-1之間)

for (int i = 0; i < arr.length; i++)

} for (int i = 0; i < arr.length; i++) else

}} return false;

} public static void main(string args) ;

boolean b = duplicate(arr);

system.out.println(b);

}}

劍指offer 陣列中重複的數字

題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。class solution 考慮這種非法輸入 for i...

劍指offer 陣列中重複的數字

在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。分析 雖然也ac了,但是沒仔細看題,可以利用題目已有條件做到更簡單的...

劍指offer 陣列中重複的數字

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