劍指offer 陣列中重複的數字

2021-08-22 05:00:11 字數 1834 閱讀 6672

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

第一種:最樸素的做法

可以使用排序方法來做,例如使用快排等。然後再遍歷一次陣列就可以找到重複的數字了。時間複雜度是o(nlogn)。這是我目前知道的演算法中,時間複雜度較好的。

第二種:利用空間換取時間

我們可以使用hashmap來儲存我們迭代過程中遍歷的值,在迭代過程中,如果發現hashmap裡面包含了我們目前遍歷到的值,則可以直接放回該值了。時間複雜度是o(n),空間複雜度也是o(n)。

使用其他資料結構也都是可以,不過第二種方法我們可以再進行優化一下。

這裡有乙個關鍵點(第三種方法需要這個前提條件),就是該陣列元素的值都是在0 ~ n-1 的範圍內。

為了方便理解(第三種做法),讓我先借助乙個布林陣列,生成乙個長度為n的布林陣列。

我們可以一邊遍歷元素,一遍讓元素的值作為下角標,先訪問布林陣列對應位置的值,如果為false,我們就設定為true,然後繼續陣列的遍歷;如果已經是true,那麼該下角標的數值就是我們要的答案。

注意注意: 下面開始講重點了(敲黑板~~~~~)

我們使用乙個布林陣列就是為了標記我們遍歷過這個數字。那麼,我們能不能在遍歷的過程中,在原陣列上面下手呢?

當然是可以,因為我們有上面提到的那個關鍵點:陣列元素的值都是0 ~ n-1的範圍內。  為了方便,我們將array作為我們需要尋找重複數字的陣列。

所以,在迭代過程中,我們將目前訪問的元素的值作為下角標(例如某數字x),將array[x] 加上 我們陣列的長度(相當於設定為true)。當然在賦值之前判斷一下array[x] 是不是 大於等於 length(小於length,可以理解為false),是的話,x就是我們要的答案。在迭代過程中,元素裡面的值有可能大於等於length,在作為下角標時,我們需要先進行求模運算,再查詢。

本人文才不好,可能這上面一段話會讓人看不懂。 所以,我們不妨這樣看,用元素的值作為下角標,我們就具體地作為數字看,大於等於length的,就求模;  通過元素的值作為下角標  訪問到的  值 ,當成布林值。小於length的,當成false;大於等於length的,當成true,且下角標就是我們要的答案。

例子:,長度為7

第一次迭代: index = array[0] ,array[index] 為 1。是false(值小於7),需要將其設定為true (值加上7) ,陣列就變成了

第二次迭代:  index = array[1] ,array[index] 為 0 。還是false 。處理與第一次迭代一樣。之後陣列變成

第三次迭代: index= array[2] ,元素值大於length了,經過求模7後,index = 1,array[index] =3 ,相同處理,陣列變成

第四次迭代後,陣列變成

第五次迭代:  index = array[4], array[index] =8,是true(大於等於length),所以index 就是第乙個重複的數字,是2。

結束迭代。

下面附上**:

public boolean duplicate(int numbers) else if(numbers[index] < length)               

}

system.out.println(result);

//等於-1就是沒有重複數字

if(result < 0)

return false;

else

return true;

}

文筆不好,請見諒! 如果有錯,歡迎提出。

劍指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的範圍...