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