数组中重复的数字
一:题目描述:
在一个长度为 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;
}
}