題目:在乙個長度為n的陣列裡所有數字都在 0 ~ n-1 的範圍內,找到陣列中的重複數字。
思路:看到問題之後的直接想法是將輸入的陣列排序,排序後找到重複數字是一件很容易的事情。可是排序乙個長度為n的陣列需要 o(nlogn) 的時間。
為了降低時間複雜度,考慮用雜湊表來解決。方案就是先建立乙個和陣列等長的雜湊表,然後從頭掃瞄陣列,每掃瞄到乙個數字,判斷雜湊表裡面是否包含此數字。如果雜湊表還沒有這個數字,就將此數字放入雜湊表,如果雜湊表裡存在這個數字,那麼就找到了重複數字。這種演算法雖然時間複雜度為 o(n) ,可是它的空間複雜度為 o(n),相當於是用額外空間的開銷換取時間。
正確的開啟方式:
注意到陣列中的數字都是 0~n-1 範圍內的。如果這個陣列中沒有重複的數字,那麼當陣列排序之後數字 i 將出現在下表為 i 的位置上。
從頭到尾掃瞄陣列中的每個數字。當掃瞄到下標為 i 的數字時,首先比較這個數字(用 m 表示)是否等於 i 。如果是,則繼續掃瞄下乙個數字;如果不是,則比較數字 m 和下標 m 個數字是否相等,如果相等,則找到了重複數字;如果不相等,則將數字 m 和下標為 m 的數字互換位置。重複上述比較、判斷,直到找到重複數字。
以陣列【2,3,1,0,2,5,3】為例。陣列的第 0 個數字為2,與它的下標不相等,於是把它和下標為 2 的數字(數字1)交換位置。交換後陣列為 【1,3,2,0,2,5,3】。此時第 0 個數字為1,和 0 仍不相等,繼續交換,得到陣列 【3,1,2,0,2,5,3】。接下來交換數字3和數字0,得到陣列 【0,1,2,3,2,5,3】 ,繼續掃瞄,在接下來的幾個數字中,下標為1,2,3的3個數字分別為1,2,3無須任何操作。接下來掃瞄到下標為4的數字2。由於下標4和數字2不相等,比較數字2的下標為2的數字,找到重複數字。
**實現:
public
static
boolean
duplicate
(int
arr)
//判斷輸入否符合題目規則
for(
int i =
0;in:
for(
int i =
0;i)//交換位置
int temp = arr[i]
; arr[i]
= arr[temp]
; arr[temp]
= temp;}}
if(flag ==
false
)return flag;
}
續找出陣列中的重複數字
續上篇找出陣列中的重複數字 方法二 利用合適的演算法進行計算。首先先想到這個規律,就是如果陣列是有序的並且元素不重複,那麼第i個位置的元素應該是i。如果第i個位置的元素不是i,就說明陣列中是存在重複數字的。利用下面的演算法 比較i和arr i 如果相等,說明i arr i 在正確的位置 如果不相等,...
陣列中重複數字
題目描述 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中第乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。返回描述 如果陣列中有重複的數字,函式返回true,否則返回...
陣列中的重複數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。1 排序 將陣列排序,然後掃瞄排序後的陣列即可。時間複雜度 o nl...