剑指 Offer 03. 数组中重复的数字

题解

排序后相邻比较

将数组进行排序之后相邻元素进行比较即可。
时间复杂度:O(n\(log_n\))
空间复杂度:O(1)

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

哈希

直接遍历一遍数组,如果遇到重复的数字直接返回就可以了,如果不存在返回-1,只需要在遍历的过程中使用一个集合存储我们遇到过的数字,方便后续判定
时间复杂度:O(n)
空间复杂度:O(n)

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

原地哈希

在题目中说明了数组中的数据小于数组的长度,我们可以使用原地哈希的方式进行判重处理,我们将每一个元素nums[i]放置到对应的nums[i]的下标位置,即交换nums[i]和nums[nums[i]]的值,如果处理中发现nums[i]等于nums[nums[i]],说明重复了,返回重复的值即可。这种方式是利用原有的数组空间为哈希表进行处理,节约了空间。
时间复杂度:O(n)
空间复杂度:O(1)

class Solution {
    public int findRepeatNumber(int[] nums) {
        for(int i = 0; i < nums.length; ){
            if(nums[i] == i) {
                i ++;
                continue;
            }
            if(nums[nums[i]] == nums[i]) return nums[i];
            int temp = nums[nums[i]];
            nums[nums[i]] = nums[i];
            nums[i] = temp;
        }
        return -1;
    }
}
posted @ 2021-04-05 22:10  Lngstart  阅读(36)  评论(0编辑  收藏  举报