题目:剑指 Offer 03. 数组中重复的数字
描述:在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例:输入:[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3
来源:力扣(LeetCode)
限制:2 <= n <= 100000
分析:给定一个指定范围的无序数组,找出其中的重复数字,可以又多个重复数字,但只要求找出其一即可;
解法一:
排序后遍历查找,因为排序之后,所有的重复数字都是挨着的,因此只需要找到相邻两个元素之间是否相同,相同重复,直接返回即可!时间复杂度:O(nlogn)
public static int findRepeatNumber(int [] arr){
Arrays.sort(arr);
for (int j=1; j <=arr.length; j++) {
if (arr[j]==arr[j-1]){
return arr[j];
}
}
return -1;
}
解法二:
hashSet,创建一个set集合,将数组中的元素添加到集合中,检查加入元素是否已经存在其中,存在表明该元素重复,返回即可!时间复杂度O(n)
public static int findRepeatumber(int[] arr){
Set<Integer>set = new HashSet<>();
for(int num : arr){
if(!set.add(num))
return num;
}
return -1;
}
解法三:
使用临时数组建立映射关系,可以把arr中元素的值和临时数组help建立映射关系,就是arr中元素的值是几,就把help中对应的位置值加++,当help某个位置的值大于1的时候,就表示出现了重复,直接返回即可,时间复杂度O(n)
public static int findRepatNumber(int[] arr){
int[]help = new int[arr.length];
for(int i=0;i<arr.length;i++){
help[arr[i]]++;
if(help[arr[i]]>1){
return arr[i];
}
}
return -1;
}
-------------------------------到底儿啦!!!------------------------