數組中重複的數字
一:題目描述:
在一個長度爲 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。數組中某些數字是重複的,但不知道有幾個數字是重複的,也不知道每個數字重複幾次。請找出數組中任意一個重複的數字。
Input:
{2, 3, 1, 0, 2, 5}
Output:
2
要求時間複雜度 O(N),空間複雜度 O(1)。
二:思路
因爲要求時間複雜度爲O(N),空間複雜度爲O(1),所以不能夠使用排序算法以及額外的標記數組。
題目爲一個長度n的數組,數據範圍爲0——n-1,那麼我們可以對數組中的數據進行換位,讓數據i放在下標爲i的位置上,即array[i] = i;同時在交換位置是判斷一下,看第i個位置上是否已經有了數值爲i的數據,如果有則證明數據重複。
三:代碼:
public class Demo03 {
/*
在一個長度爲 n 的數組裏的所有數字都在 0 到 n-1 的範圍內。
數組中某些數字是重複的,但不知道有幾個數字是重複的,
也不知道每個數字重複幾次。
請找出數組中任意一個重複的數字。
*/
public static void main(String[] args) {
int[] array = {2,3,1,0,2,5};
int rep = findRep(array);
System.out.println("重複數據爲:"+rep);
}
public static int findRep(int[] array){
//判斷
if (array == null||array.length<=0){
return -1;
}
for (int i = 0; i < array.length; i++) {
while (array[i]!=i){
/*
判斷一下,如果當交換位置的時候,原來i的位置已經是i了,這時證明找到
重複數據
*/
if (array[i] == array[array[i]]){
return array[i];
}
/*不相等,那麼將i位置的數據,放入到array[i]位置,
原本在array[i]位置的數據放入到i位置上
*/
swap(array,i,array[i]);
}
}
return -1;
}
public static void swap(int[] array,int i, int num){
int temp = num;
array[i] = array[num];
array[num] = temp;
}
}