找出数组中重复的数字。


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

示例 1:

输入:
[2, 3, 1, 0, 2, 5, 3]
输出:2 或 3 

 

限制:

2 <= n <= 100000

Related Topics
  • 数组
  • 哈希表
  • 排序

  • 👍 756
  • 👎 0
  • 哈希排序之类的解法都很好理解,不做赘述了,主要就讲下原地交换的解法

    照旧,看图,主要还是利用的数组本身下标作为哈希来实现的,用数组代替哈希表来实现哈希是中常用的哈希优化方法,必要的话还是需要掌握下

    第一行对应下标索引,从第二行开始为数字,每行表示每次操作的事项

    第一行对应下标索引,从第二行开始为数字,每行表示每次操作的事项

    • 从下标0开始,下标0上的数字为2,把下标0和下标2上的数字交换
    • 此时下标0上的数字已经变为1了,继续和下标1上的数字交换
    • 此时下标0上的数字已经变为3了,继续和下标3上的数字交换
    • 此时下标0上的数字已经变为1了
    • 往后依次查找,下标和上面的值是否相等
    • 直到遇到下标4的时候,下标4上的值为2,那么和下标2进行交换,但是下标2上的值已经为2了,此时冲突发生,直接返回结果2
    class Solution {
        public int findRepeatNumber(int[] nums) {
            int i = -1;
            while ( ++i < nums.length ){
                if(nums[i]==i)continue;
                while (nums[i]!=i){
                    if (nums[nums[i]] == nums[i]){
                        return nums[i];
                    }
                    swap(nums,i,nums[i]);
                }
            }
            return -1;
        }
    
        public void swap(int[] nums,int i, int j){
            int tmp = nums[i];
            nums[i] = nums[j];
            nums[j] = tmp;
        }
    }