题目描述
在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为 7 的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字 2。
解题思路
我们需要一个结构,用来存放数据是否出现过,而且方便查找是否存在。
- 第一种思路就是用 map;
- 稍微高级点就是用数字的二进制;
- 高级思路是用数组本身作为存放数据的结构,因为题目保证所有数字在 0~n-1 之间,可以利用索引来存储数据。
代码
代码 1(map)
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if (numbers == null || numbers.length == 0)
return false;
int[] help = new int[length];
help[0] = -1;
for (int i = 0; i < length; i++) {
if (numbers[i] >= length || numbers[i] < 0)
return false;
if (help[numbers[i]] == numbers[i]) {
duplication[0] = numbers[i];
return true;
}
help[numbers[i]] = numbers[i];
}
return false;
}
}
代码 2(数组本身)
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if (numbers == null || numbers.length == 0)
return false;
for ( int i= 0 ; i<length; i++) {
int index = numbers[i];
if (index >= length)
index -= length;
if (numbers[index] >= length) {
duplication[0] = index;
return true;
}
numbers[index] = numbers[index] + length;
}
return false;
}
}
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于