题目描述


原题链接:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

在一个长度为 n 的数组 nums 里的所有数字都在 0~n-1 的范围内。数组中某些数字是重复的,但不知道有几个数字重复了,也不知道每个数字重复了几次。请找出数组中任意一个重复的数字。

  1. Input:
  2. {2, 3, 1, 0, 2, 5}
  3. Output:
  4. 2

解题思路一:哈希表法


K神题解:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

利用 HashSet 可以用 contains( ) 方法判断是否存在重复的元素。

  1. public int findRepeatNumber(int[] nums) {
  2. HashSet<Integer> dic = new HashSet<>();
  3. for(int num : nums) {
  4. if(dic.contains(num))
  5. return num;
  6. dic.add(num);
  7. }
  8. return -1;
  9. }

解题思路二:原地置换法


K神题解:https://leetcode-cn.com/problems/shu-zu-zhong-zhong-fu-de-shu-zi-lcof/

重点是循环交换索引 i 上的值 nums[i] 的值成为 i 之前的所有交换过程中,都没有遇到重复的数字,那么就表示索引 i 上的值 nums[i] 可以成功交换为值 i ,然后再 i++ 继续循环交换。

  1. /**
  2. * 原地置换法
  3. */
  4. public int findRepeatNumber(int[] nums) {
  5. public int findRepeatNumber(int[] nums) {
  6. int i = 0;
  7. while(i < nums.length) {
  8. if(nums[i] == i) {
  9. i++;
  10. continue;
  11. }
  12. if(nums[nums[i]] == nums[i])
  13. return nums[i];
  14. int tmp = nums[i];
  15. nums[i] = nums[tmp];
  16. nums[tmp] = tmp;
  17. }
  18. return -1;
  19. }
  20. }