1394-找出数组中的幸运数

Raphael Liu Lv10

在整数数组中,如果一个整数的出现频次和它的数值大小相等,我们就称这个整数为「幸运数」。

给你一个整数数组 arr,请你从中找出并返回一个幸运数。

  • 如果数组中存在多个幸运数,只需返回 最大 的那个。
  • 如果数组中不含幸运数,则返回 -1

示例 1:

**输入:** arr = [2,2,3,4]
**输出:** 2
**解释:** 数组中唯一的幸运数是 2 ,因为数值 2 的出现频次也是 2 。

示例 2:

**输入:** arr = [1,2,2,3,3,3]
**输出:** 3
**解释:** 1、2 以及 3 都是幸运数,只需要返回其中最大的 3 。

示例 3:

**输入:** arr = [2,2,2,3,3]
**输出:** -1
**解释:** 数组中不存在幸运数。

示例 4:

**输入:** arr = [5]
**输出:** -1

示例 5:

**输入:** arr = [7,7,7,7,7,7,7]
**输出:** 7

提示:

  • 1 <= arr.length <= 500
  • 1 <= arr[i] <= 500

方法一:哈希映射

思路

我们可以使用哈希映射来解决这个问题,把数值作为键,把数值出现的次数作为值。具体地,我们先遍历原数组建立哈希表,然后遍历哈希表找到最大的键和值相等的元素作为答案,如果找不到就返回 -1。

fig1

代码

[sol1-C++]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public:
unordered_map <int, int> m;
int findLucky(vector<int>& arr) {
for (auto x: arr) ++m[x];
int ans = -1;
for (auto [key, value]: m) {
if (key == value) {
ans = max(ans, key);
}
}
return ans;
}
};
[sol1-Python3]
1
2
3
4
5
6
7
8
9
10
class Solution:
def findLucky(self, arr: List[int]) -> int:
m = dict()
for x in arr:
m[x] = m.get(x, 0) + 1
ans = -1
for (key, value) in m.items():
if key == value:
ans = max(ans, key)
return ans
[sol1-Java]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Solution {
public int findLucky(int[] arr) {
Map<Integer, Integer> m = new HashMap<Integer, Integer>();
for (int x : arr) {
m.put(x, m.getOrDefault(x, 0) + 1);
}
int ans = -1;
for (Map.Entry<Integer, Integer> entry : m.entrySet()) {
int key = entry.getKey(), value = entry.getValue();
if (key == value) {
ans = Math.max(ans, key);
}
}
return ans;
}
}
[sol1-JavaScript]
1
2
3
4
5
6
7
8
9
10
11
var findLucky = function(arr) {
let m = {}
arr.forEach((x) => {
m[x] = (x in m ? m[x] + 1 : 1)
})
let ans = -1
Object.keys(m).forEach((key) => {
ans = (key == m[key] ? Math.max(key, ans) : ans)
})
return ans
};

复杂度分析

记数组中的的元素个数为 n,则哈希表中最多有 n 个键值对。

  • 时间复杂度:遍历数组的时间代价是 O(n),遍历哈希表的时间代价也是 O(n),故渐进时间复杂度 O(n)。

  • 空间复杂度:哈希表中最多有 n 个键值对,故渐进空间复杂度 O(n)。

 Comments
On this page
1394-找出数组中的幸运数