題目描述
在乙個長度為n的陣列裡的所有數字都在0到n-1的範圍內。 陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。 例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。
方法一直接暴力破解,挨個比試
public
boolean
duplicate
(int
numbers,
int length,
int[
] duplication)
int times =0;
for(
int i =
0; i < numbers.length && times ==
0; i++)}
}return times >0?
true
:false
;}
方法二
先對陣列進行排序,然後從排序的陣列中找到重複的數字。在排序中找到重複的數字是很簡單的事情,但是排序的時間複雜度需要o(nlogn)的時間。
方法三借用乙個雜湊表,從頭到尾順序掃瞄陣列中的每個數字,如果該數字沒有在雜湊表中,那麼加入雜湊表;如果找到乙個重複,那麼就是找到了重複的數字,但是該方法需要借用乙個空間複雜度的o(n)雜湊表。
方法四因為陣列中數字都是在0-(n-1)的範圍內,那麼如果陣列中沒有重讀數字,那麼排序之後的數字i將出現在下標為i的位置。如果有重複的數字,那麼有些位置會存在多個數字,同時有些位置可能沒有數字。我們可以重排陣列,當掃瞄到下標為i的數字時,比較該數字(用m表示)是不是等於i,如果是,那麼掃瞄下乙個數字;如果不是,拿它與第m個數字進行比較。如果和第m個數字相等,就找到了乙個重複的數字,因為該數字在下標為i和m的位置都出現了;如果和第m個數字不同,就把第i個和第m個數字交換位置。
public
boolean
duplicate_2
(int
numbers,
int length,
int[
] duplication)
swap
(numbers, i, numbers[i]);
}}return
false;}
public
void
swap
(int
elem,
int i,
int j)
方法五
可以利用現有陣列設定標誌,當乙個數字被訪問過後,可以設定對應位上的數 + n,之後再遇到相同的數時,會發現對應位上的數已經大於等於n了,那麼直接返回這個數即可。
public
boolean
duplicate_3
(int
numbers,
int length,
int[
] duplication)
if(numbers[index]
>= length)
numbers[index]
= numbers[index]
+ length;
}return
false
;}
陣列 陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是第乙個重複的數字2。思路 python 實現 an highlighted block ...
陣列中重複的數字
在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道哪幾個 數字重複了,也不知道每個數字重複了幾次。請找出陣列中任意乙個重複的數字。例如 如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。include iostream using namespace ...
陣列中重複的數字
題目 在乙個長度為n的陣列裡的所有數字都在0到n 1的範圍內。陣列中某些數字是重複的,但不知道有幾個數字是重複的。也不知道每個數字重複幾次。請找出陣列中任意乙個重複的數字。例如,如果輸入長度為7的陣列,那麼對應的輸出是重複的數字2或者3。思路 用雜湊表解決的時間複雜度和空間複雜度為o n 因為陣列中...