LeetCode:数组中重复的数字

249 阅读1分钟

一、题目描述

二、思路分析

方法 1:暴力法

这个没啥好说的,测试直接运行超时。

方法 2:用哈希表去重

利用哈希表的特性,遍历数组。当哈希表中没有重复的数组元素时,将元素加入到哈希表中,否则返回重复元素。

方法 3:原地置换法

由于数组元素的特殊性,所有的元素大小范围在 0~n-1之间(n 是数组长度)。可以知道,如果不存在重复元素,数组下标的位置和元素是一一对应的。因此,我们通过遍历数组,当数组元素不在它对应的位置时,如果此时该位置的元素和当前遍历的数组元素相同,返回当前数组元素即可。否则将当前遍历数组元素和在数组此下标的元素交换位置

三、题解

  • 方法 2:采用哈希表去重
class Solution {
    public int findRepeatNumber(int[] nums) {
        Set<Integer> set = new HashSet<>();
        for(int i = 0; i < nums.length; i++) {
            if (set.contains(nums[i])) {
                return nums[i];
            }
            set.add(nums[i]);
        }
        return -1;
    }
}
  • 方法 3:原地置换法
class Solution {
    public int findRepeatNumber(int[] nums) {
        for(int i = 0; i < nums.length; i++) {
            while (nums[i] != i) {
                // 当前遍历数组元素与它对应的数组下标位置的元素重复
                if (nums[i] == nums[nums[i]]) {
                    return nums[i];
                }
                // 交换位置
                int tmp = nums[i];
                nums[i] = nums[tmp];
                nums[tmp] = tmp;
            }
        }
        return -1;
    }
}