劍指offer 問題3 找出陣列中重複的數字

2021-09-27 10:47:13 字數 1744 閱讀 6643

題目:

在乙個長度為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...