剑指offerJZ3 数组中重复的数字
剑指offer JZ3 数组中重复的数字
描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中任意一个重复的数字。 例如,如果输入长度为7的数组[2,3,1,0,2,5,3],那么对应的输出是2或者3。存在不合法的输入的话输出-1
示例1:
输入: [2,3,1,0,2,5,3]
返回值: 2
说明: 2或3都是对的
数据范围:0≤n≤10000
进阶:时间复杂度O(n) ,空间复杂度O(n)
这是一道相对简单的数组题,哪样时间和空间复杂度较低,是我们考虑的事情。感兴趣的同学可以上手试试(JZ3 数组中重复的数字)
解法一:
思路:
-
新建一个res数组。
-
将number数组的值变为res数组的下标,如果有重复的下标则返回-1。
public int duplicate (int[] numbers) {
//将numbers数组的值改变为数组的下标,如果有重复的下标则直接返回;
int[] res=new int[numbers.length];
for(int i: numbers){
res[i]++;
if(res[i] == 2){
return i;
}
}
return -1;
}
时间复杂度O(n) ,空间复杂度O(n) 。
解法二:
思路:
- 新建temp布尔型数组。
- 遍历numbers数组,用numbers的值当temp的下标。
- 第一次检测到该下标,都设置为true
- 当第二次检测到该下标存在则返回该数字。
public int duplicate (int[] numbers) {
boolean[] temp = new boolean[numbers.length];
for(int i = 0; i < numbers.length; i++) {
if(temp[numbers[i]]) {
return numbers[i];
} else {
temp[numbers[i]] = true;
}
}
return -1;
}
时间复杂度O(n) ,空间复杂度O(n) 。