LeetCode~961. 在长度 2N 的数组中找出重复 N 次的元素

115 阅读1分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第14天,点击查看活动详情

题目描述

给你一个整数数组 nums ,该数组具有以下属性:

  • nums.length == 2 * n.
  • nums 包含 n + 1不同的 元素
  • nums 中恰有一个元素重复 n 次 找出并返回重复了 n 次的那个元素。

示例

输入: nums = [1,2,3,3]
输出: 3
输入: nums = [2,1,2,5,3,2]
输出: 2
输入: nums = [5,1,5,2,5,3,5,4]
输出: 5

提示

  • 2 <= n <= 5000
  • nums.length == 2 * n
  • 0 <= nums[i] <= 104^4
  • numsn + 1不同的 元素组成,且其中一个元素恰好重复 n

哈希表

提示中说明了目标数组中仅有一个元素是重复的,其余元素均不相同,那么我们就可以才用哈希表的特性,将出现过的元素存入集合中缓存起来,用于后续重复元素的判断,当后续遇上了重复的元素,则直接返回该元素即可。

class Solution {
    public int repeatedNTimes(int[] nums) {
        // 缓存出现过的元素
        Set<Integer> set = new HashSet<>();
        
        // 遍历目标数组
        for(int num : nums){
            // 存入缓存集合
            if(!set.add(num)){
                // 保存失败表示该元素已存在,直接返回结果
                return num;
            }
        }
        return nums[0];
    }
}

随机数

由于重复的数量为n,占据了目标数组的一般,那么我们有50%的概率能得到该元素,这里我们可以使用随机数来得到任意的两个索引,进行判断,当两个不同位置的元素相等时,则表示找到结果。

class Solution {
    public int repeatedNTimes(int[] nums) {
        int n = nums.length;
        Random random = new Random();

        while (true) {
            // 随机获取两位数,比较是否相等,相等则返回结果
            int x = random.nextInt(n), y = random.nextInt(n);
            if (x != y && nums[x] == nums[y]) {
                // 匹配目标,返回结果
                return nums[x];
            }
        }
    }
}