题目:在一个长度为n的数组里的所有数字都在0到n-1的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复的次数。请找出数组中任意一个重复的数字。
思路:
1、首先想到的是排序,然后再做处理;
2、利用哈希表,数组中值作为key,出现次数作为value(当然此处也可用数组代替哈希表),构造完哈希表后,查询value大于1的key,空间复杂度O(n),时间复杂度O(n);
3、不使用额外的空间,将数组中值为i的元素换到i位置
举个例子
arr={2,3,1,0,2,5}
输出为:2
index:0 (2,3,1,0,2,5)2与1交换
(1,3,2,0,2,5)1与3交换
(3,1,2,0,2,5)3与0交换
(0,1,2,3,2,5)0处于index=0的位置
(0,1,2,3,2,5)1处于index=1的位置
......
遍历到index=4时,会发现index=2位置上已经有2了,故2重复了。
方法三的java代码如下
public class code_2_solution {
/***
* 查找数组中重复的数字
* @param arr
* @return
*/
public static int findDuplicateNum(int[] arr) {
int res= Integer.MAX_VALUE;
if(arr==null || arr.length==0) return res;
for (int i=0;i<arr.length;i++) {
while(arr[i] !=i) {
if (arr[i]==arr[arr[i]]) {
res = arr[i];
break;
}
swapNum(arr,i);
}
}
return res;
}
public static void swapNum(int[] arr, int index){
int temp = arr[index];
arr[index] = arr[temp];
arr[temp] = temp;
}
}
难免纰漏,欢迎指正。
网友评论