LC 1394.Find Lucky Integer in an Array

题目描述

这是 LeetCode 上的 1394. 找出数组中的幸运数 ,难度为简单

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

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

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

1
2
输入:arr = [7,7,7,7,7,7,7]
输出:7

提示:

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

解答

方法一:哈希表

最容易想到的方法就是用一个哈希表来存储出现的数字和次数,然后再用一个循环判断是否相等,返回其中最大的”幸运数“。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution {
public int findLucky(int[] arr) {
var hashMap = new HashMap<Integer, Integer>();
for (int i = 0; i < arr.length; ++i) {
if (hashMap.containsKey(arr[i])) {
hashMap.put(arr[i], hashMap.get(arr[i]) + 1);
} else {
hashMap.put(arr[i], 1);
}
}
int res = -1;
for (var entry : hashMap.entrySet()) {
if (entry.getKey() == entry.getValue() && entry.getKey() > res) {
res = entry.getKey();
}
}
return res;
}
}
  • 时间复杂度\(O(n)\),遍历数组的时间代价是\(O(n)\),遍历哈希表的代价也是\(O(n)\),故渐进时间复杂度为\(O(n)\)
  • 空间复杂度\(O(n)\),哈希表中最多有\(n\)个键值对,故渐进空间复杂度为\(O(n)\)

方法二:用数组模拟哈希表

由提示中的数据可以看出可以用数组模拟哈希表来实现哈希表的功能,具体原理和方法一一样。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class Solution {
public int findLucky(int[] arr) {
int[] tmp = new int[500];
for (int i : arr) {
++tmp[i - 1];
}
for (int i = 499; i >= 0; --i) {
if (i + 1 == tmp[i]) {
return i + 1;
}
}
return -1;
}
}
  • 时间复杂度\(O(n)\),遍历数组的时间代价是\(O(n)\),临时数组的大小为常数,所以时间复杂度为\(O(n)\)

  • 空间复杂度\(O(1)\),临时数组的大小为常数,所以空间复杂度为\(O(1)\)

每题一图


LC 1394.Find Lucky Integer in an Array
https://chen-huaneng.github.io/2023/12/05/2023-12-5-2023-12-05-lc-1394/
作者
Abel
发布于
2023年12月5日
更新于
2023年12月5日
许可协议