一、题目描述
在一个长度为n的数组里的所有数字都在0到n-1的范围内。 数组中某些数字是重复的,但不知道有几个数字是重复的。也不知道每个数字重复几次。请找出数组中第一个重复的数字。 例如,如果输入长度为7的数组{2,3,1,0,2,5,3},那么对应的输出是第一个重复的数字2。
返回描述:
如果数组中有重复的数字,函数返回true,否则返回false。
如果数组中有重复的数字,把重复的数字放到参数duplication[0]中。
(PS : duplication已经初始化,可以直接赋值使用。)
二、分析
2.1 方法一
分析:第一为常规解法,我们可以用一个boolean数组来表示数字是否存在,存在就是true,不存在就是false,如[2,0,3,0,4,1,5],下标为1和3两个位置上的数字都是0,即numbers[1]与numbers[3]均等于0,假设numbers[1]=0对应布尔数组arr[1]=true,走到index=3时,numbers[3]=0也是对应arr[0],此时arr[0]=true,表示已经有一个数字0,故返回true。
实现代码如下:
public class Solution {
public boolean duplicate(int numbers[], int length, int [] duplication) {
if (numbers == null || length <= 1) {
return false;
}
// 长度为n的布尔数组用于判断数字是否存在
boolean[] arr = new boolean[length];
for (int i = 0 ; i < length ; i++) {
int val = numbers[i];
// 判断重复数字
if (arr[val] == true) {
duplication[0] = val;
return true;
}
arr[val] = true;
}
return false;
}
}
2.2 方法二
分析:第二个方法是用java中的HashMap,HashMap由key值,values值两部分组成,最重要的是map.containsKey(numbers[i])这个方法,作用是判断对应值是否已经存在于map集合中,若未存在,则用map.put放进去,并且values值赋值为1,表示目前已经出现一次,若已经存在,则为第一次重复,我们就将重复值赋给duplication[0],并返回true。
实现代码如下:
import java.util.Map;
import java.util.HashMap;
public class Solution {
public boolean duplicate(int numbers[],int length,int [] duplication) {
if(numbers == null || numbers.length <= 1)
return false;
Map<Integer,Integer> map = new HashMap<Integer,Integer>();
boolean flag = false;
for(int i=0 ; i<length ; i++){
if(!map.containsKey(numbers[i])){
map.put(numbers[i], 1);
}else{
duplication[0] = numbers[i];
flag = true;
break;
}
}
return flag;
}
}