「这是我参与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 <= 5000nums.length == 2 * n0 <= nums[i] <= 10^4nums由n + 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)