独一无二的出现次数

LeetCode每日一题,1207. Unique Number of Occurrences

先看题目描述

B1LP8f.png

大意就是给定一个数组 arr,让我们判断数组中每个数字中出现的次数是否为唯一的

算法和思路

哈希表

大致思路就是使用两个哈希表,一个哈希表 cnt 存储数组中每个数字对应的出现次数,一个哈希表 map 存储出现次数对应的数字,遍历一次 arr 数组将 cnt 填充好后,然后用 cnt 以数字的出现次数作为 key 值去填充 map,在填充 map 时若出现 key 值已存在的情况,则说明出现了有两个数字的出现次数相同的情况,直接返回 false;若填充完以后也未出现这种情况,则返回 true

算法源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import java.util.*;

class Solution {
public boolean uniqueOccurrences(int[] arr) {
Map<Integer, Integer> cnt = new HashMap<>();
Map<Integer, Integer> map = new HashMap<>();
for (int num : arr) {
cnt.put(num, cnt.getOrDefault(num, 0) + 1);
}
for (int key: cnt.keySet()) {
int count = cnt.get(key);
if (!map.containsKey(count)) {
map.put(count, key);
} else {
return false;
}
}
return true;
}
}

然后去看题解,发现题解使用的是集合,在将存储数组中每个数字对应的出现次数的哈希表填充好以后,题解中代码是将哈希表中的每个 value 值加入到一个集合中,由于集合会自动去重,最后只需判断集合的大小和哈希表的大小是否相等即可

两个的效率基本是一致的,不过题解的代码中有一些用法和函数是以前没接触过的,例如哈希表的 getOrDefault(x, default)方法,这个方法和 python 中字典的 get 方法是差不多的,就是若 key 中存在 x 的话,则返回其对应的 value 值,否则就返回 default;还有就是哈希表的 entrySet() 方法,这个方法会返回哈希表中的所有键值对 Entry<key, value>,而键值对 Entry 又有相应的 getKey() 和 getValue() 等获取健和获取值的方法

代码如下

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public boolean uniqueOccurrences(int[] arr) {
Map<Integer, Integer> occur = new HashMap<Integer, Integer>();
for (int x : arr) {
occur.put(x, occur.getOrDefault(x, 0) + 1);
}
Set<Integer> times = new HashSet<Integer>();
for (Map.Entry<Integer, Integer> x : occur.entrySet()) {
times.add(x.getValue());
}
return times.size() == occur.size();
}
}