方法一:最简单的一个想法是 先把数组进行排序,再在数组中找到重复的数字
排序,时间O(nlogn),空间O(logn),修改了原数据

import java.util.*;
class Solution {
    public int findRepeatNumber(int[] nums) {
        Arrays.sort(nums);
        int ans = 0;
        for(int i=1;i<nums.length;i++){
            if (nums[i] == nums[i-1]){
                ans = nums[i];
                return ans;
            }

        }
        return -1;
    }
}

方法二:还可以利用哈希表来解决该问题,没扫描到一个数字,若哈希表里已存在,就找到,否则加入 哈希表 hash表,时间O(n),空间O(n),不修改原数据

class Solution {
    public int findRepeatNumber(int[] nums) {
        HashSet<Integer> set = new HashSet<>();
        for (int num:nums){
            if (set.contains(num))
                return num;
            set.add(num); 
        }
        return -1;
    }
}

方法三:利用辅助数组,与方法2类似,时间O(n),空间O(n),不修改原数据

class Solution {
    public int findRepeatNumber(int[] nums) {
        int []nums2 = new int[nums.length];
        for (int i=0;i<nums.length;i++){
            nums2[nums[i]]++;
            if (nums2[nums[i]]>1)
                return nums[i];
        }
        return -1;
    }
}

方法四:鸽巢原理(一个萝卜一个坑)

class Solution {
    public int findRepeatNumber(int[] nums) {
        if (nums == null || nums.length==0)
            return -1;
        for(int i=0;i<nums.length;i++){
            while (nums[i]!=i){
                int temp = nums[i];
                if (nums[i] == nums[temp])
                    return nums[i];
                nums[i] = nums[temp];
                nums[temp] = temp;    
            }  
        }
        return -1; 
    }
}