题目
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
解题思路
思路1——桶计数
判断有重,第一反应就是桶计数的方法,也就是bitmap的思想,对于数字n,让数组array[n]+1即可作为标记,在自增的时候判断一下是否大于0即可,该方案的时间复杂度为n,空间复杂度也为n
思路2——数组排序
这里说的不是sort一下再遍历,那行不通的,因为题目中给出的是要输出第一个重复的数字,注意这里注重顺序第一
以及数量一个
,结合上面的桶计数的思路,在遍历原始数组的时候进行排序,注意到题干信息中的长度为n
,数字在0到n-1
范围内,因此我们可以在遍历的时候将n与数组下标对应起来,即将n放到array[n]中去,并在交换的过程中进行判断是否重复。
解题代码
public boolean duplicate(int numbers[],int length,int [] duplication) {
for (int i = 0;i<length;i++){
//只要数组下标与内容不等,就进行交换,交换前验证一下要交换的两个元素是否相等
while (numbers[i] != i){
if (numbers[i] == numbers[numbers[i]]){
duplication[0] = numbers[i];
return true;
}
swap(i,numbers[i],numbers);
}
}
return false;
}
public static void swap (int from , int to , int[] numbers){
int t = numbers[to];
numbers[to] = numbers[from];
numbers[from] = t;
}