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

272 阅读1分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」。

题目描述:

961. 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode) (leetcode-cn.com)

给你一个整数数组 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] <= 10^4
  • numsn + 1不同的 元素组成,且其中一个元素恰好重复 n

思路分析

哈希表

这个应该属于暴力解法了,直接用哈希表统计次数,元素个数超过1的即为答案。

AC代码

class Solution {
    public int repeatedNTimes(int[] A) {
        Map<Integer, Integer> count = new HashMap();
        for (int x: A) {
            count.put(x, count.getOrDefault(x, 0) + 1);
        }

        for (int k: count.keySet())
            if (count.get(k) > 1)
                return k;
    }
}

总结

上面我们的解法还有优化的地方,比如我只要插入的时候检查下该元素在哈希表中是不是存在就好了。

另外官方还提供了另外一种解法:

因为数组中有N个非重复元素和N个重复元素,无论N个重复元素如何均匀地分布在总共2N个元素中,总能找到上述长度为4的连续子序列。 所以算法中只要遍历所有长度为4的连续子序列就可以了。

参考

重复 N 次的元素 - 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode) (leetcode-cn.com)

Kotlin solution - 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode) (leetcode-cn.com)

[Alton] 重复N次的元素,窗口异或(相等判断) + 统计 - 在长度 2N 的数组中找出重复 N 次的元素 - 力扣(LeetCode) (leetcode-cn.com)