題目:
在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。
思路:
首先新手想到的就是最簡單的暴力查詢,也就是從陣列 0 下標位置開始,依次比對陣列後所有元素,看是否有重複。
public
class
test
;int result =
ret(arr)
; system.out.
println
(result);}
//定義返回-1為沒有重複元素
public
static
intret
(int
arr)}}
return-1
;}}
但是這樣如果做我們的時間複雜度為o(n^2),會浪費大量時間.所以換一種做法,我們發現所有的數字都在0 ~ n - 1 之間,那麼我們重新排列這個陣列,使得排列之後的陣列中,數字 n 出現先 n 下標的位置上,這樣猶豫陣列中有重複元素,那麼有些位置就可能存在多個數字,這樣就找打重複的數字。
我們按照步驟將動作一步一步講解:
例如:
陣列 arr 中元素為
; 他們的下標為 0,1
,2,3
,4;從第0下標位置開始,
0下標對應的數字是3,那麼3下標對應的數字不是3,那麼我們就交換0下標和3下標的數字 交換之後的陣列是
;然後我們繼續看0下標的數字是1,那麼1下標對應的數字不是1,那麼繼續交換0和1下標的數字,交換之後的陣列為
;同樣在看0下標的數字現在是4,4下標的數字不是4,那麼交換0下標和4下標的數字,交換之後的陣列為
這時0下標對應的陣列是2,而2下標對應的陣列還是2,說明數字2重複了,所以返回2
以上思路用**具體實現:
public
class
findduplication
//測試**
public
static
void
test()
; system.out.
println
(getduplicate
(arr));
}//找到陣列中乙個重複的數字
//返回-1代表無重複數字或者輸入無效
public
static
intgetduplicate
(int
arr)
//判斷陣列中元素合法性
for(
int x : arr)
}//3 4 2 1 2
for(
int i =
0; i < arr.length; i++
)//交換arr[arr[i]] 和 arr[i]
temp = arr[i]
; arr[i]
= arr[temp]
; arr[temp]
= temp;}}
system.out.
println
("陣列中無重複數字!");
return-1
;}}
劍指Offer 3 找出陣列中重複的數字
給定乙個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。注意 如果某些數字不在 0 n 1 的範圍內,或陣列中不包含重複數字,則返回 1 樣例給定 nums 2...
劍指offer(3)找出陣列中重複的數字
在乙個二維陣列中,每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數 兩種實現思路 1.借助二分法,二維陣列的每一行看作是乙個排序陣列,進行二分查詢 2.選用右上角或者左下角開始比較查詢 二分法 publ...
劍指offer 陣列 找出陣列中重複的數字
給定乙個長度為 n 的整數陣列 nums,陣列中所有的數字都在 0 n 1 的範圍內。陣列中某些數字是重複的,但不知道有幾個數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。注意 如果某些數字不在 0 n 1 的範圍內,或陣列中不包含重複數字,則返回 1 樣例給定 nums 2...