题目描述
原题链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。
Input:{2, 3, 1, 0, 2, 5}Output:2
解题思路一:哈希表法
K神题解:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
利用 HashSet 可以用 contains( ) 方法判断是否存在重复的元素。
public int findRepeatNumber(int[] nums) {HashSet<Integer> dic = new HashSet<>();for(int num : nums) {if(dic.contains(num))return num;dic.add(num);}return -1;}
解题思路二:原地置换法
K神题解:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/
重点是循环交换索引 i 上的值 nums[i] 的值成为 i 之前的所有交换过程中,都没有遇到重复的数字,那么就表示索引 i 上的值 nums[i] 可以成功交换为值 i ,然后再 i++ 继续循环交换。
/*** 原地置换法*/public int findRepeatNumber(int[] nums) {public int findRepeatNumber(int[] nums) {int i = 0;while(i < nums.length) {if(nums[i] == i) {i++;continue;}if(nums[nums[i]] == nums[i])return nums[i];int tmp = nums[i];nums[i] = nums[tmp];nums[tmp] = tmp;}return -1;}}
