找出数组中重复的数字。
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
示例 1:
输入:
[2, 3, 1, 0, 2, 5, 3]
输出: 2 或 3限制:
2 < = n < = 100000 2 <= n <= 1000002<=n<=100000
//思路1:由于数据是在0~n-1范围内,定义一个长度为n的辅助数组temp,下标代表nums中的数据 class Solution1{ public static int findRepeatNumber(int[] nums){ //合法性检查 if (nums == null || nums.length == 0){ return -1; } for (int i = 0; i < nums.length; i++) { if(nums[i] <0 || nums[i] >nums.length -1){ return -1; } } // 判断逻辑 int[] temp = new int[nums.length]; for (int i = 0; i < nums.length; i++) { temp[nums[i]] += 1; } for (int i = 0; i < temp.length; i++) { if(temp[i] > 1){ return i; } } return -1; //无重复数字 } } // 思路2:将数组排序,排序后判断相邻元素是否相等,如果相等就说明出现了重复数 class Solution2{ public static int findRepeatNumber(int[] nums){ //合法性检查 if (nums == null || nums.length == 0){ return -1; } //判断逻辑 Arrays.sort(nums); for (int i = 0; i < nums.length-1; i++) { if(nums[i] == nums[i+1]){ return nums[i]; } } return -1; } } // 思路3:利用HashSet class Solution3{ public int findRepeatNumber(int[] nums){ //合法性检查 if (nums == null || nums.length == 0){ return -1; } //判断逻辑 Set<Integer> set = new HashSet<>(); for (int num : nums){ if(!set.add(num)){ return num; } } return -1; } }