独一无二的出现次数
1.题目链接
1207. 独一无二的出现次数
2.原题描述:
给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false。
3.相关算法
哈希表:
使用哈希表统计每个数的出现次数,然后再用一个哈希表存储出现次数,如果出现次数有重复,则返回false,否则返回true。
桶排序:
由于数组中的数的范围比较小,所以可以使用桶排序统计每个数的出现次数,然后再用一个桶存储出现次数,如果出现次数有重复,则返回false,否则返回true。
4.本题主要思路
本题主要讲解哈希表的解题思路,先创建一个哈希表用于统计数组中每个数出现的次数,再创建一个set集合来存放所有数字出现的次数,最后通过比较哈希表的数量与set去重之后的数量进行比较,若相等则返回true,否则返回false。
5.源码分析
class Solution {
public boolean uniqueOccurrences(int[] arr) {
Map<Integer,Integer> map = new HashMap<>(); // 1
for(int x : arr){
map.put(x,map.getOrDefault(x, 0) + 1); // 2
}
Set<Integer> set = new HashSet<>(); // 3
int cnt = map.size(); // 4
for (Map.Entry<Integer, Integer> x : map.entrySet()) {
set.add(x.getValue()); // 5
}
return set.size()==cnt; // 6
}
}
- 创建哈希表,用于存放每个数字以及出现的次数;
- 遍历数组,将每个数字以及出现的次数存放到哈希表中;
- 创建set集合,用于存放哈希表中每个数字出现的次数;
- 记录哈希表中元素的数量;
- 将哈希表中记录的次数存放到set集合中进行去重(也可以记性重复性判断,当以经有相等的次数时可以直接返回,本文采用了一种节省代码,但费时的解法);
- 判断set集合中的元素数量是否等于哈希表中的数量,若不相等,则set去重了,表示有相同次数的返回false,反之返回true。