题目:剑指 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;
	}

-------------------------------到底儿啦!!!------------------------