961. 重复 N 次的元素

题目

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

  • nums.length == 2 * n.
  • nums 包含 n + 1不同的 元素
  • nums 中恰有一个元素重复 n

返回重复了 N 次的那个元素。

示例1:

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

示例2:

1
2
输入:[2,1,2,5,3,2]
输出:2

示例3:

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

提示:

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

解法

解法一:

借助HashMap

JAVA

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public int repeatedNTimes(int[] A) {
Map<Integer, Integer> map = new HashMap<>();
for (int a : A) {
if (map.containsKey(a)) {
if (map.get(a) + 1 == A.length / 2) {
return a;
}
map.replace(a, map.get(a) + 1);
} else {
map.put(a, 1);
}
}
return -1;
}

解法二:

比较

一旦找到一个重复元素,那么一定就是答案。我们称这个答案为主要元素。

考虑所有长度为 4 的子序列,在子序列中一定至少含有两个主要元素。

这是因为:

  • 长度为 2 的子序列中都是主要元素,或者;
  • 每个长度为 2 的子序列都恰好含有 1 个主要元素,这意味着长度为 4 的子序列一定含有 2 个主要元素。

因此,只需要比较所有距离为 1,2 或者 3 的邻居元素即可。

Java

1
2
3
4
5
6
7
8
public int repeatedNTimes(int[] A) {
for (int k = 1; k <= 3; ++k)
for (int i = 0; i < A.length - k; ++i)
if (A[i] == A[i+k])
return A[i];

return -1;
}
0%