给你一个整数数组 arr
,请你帮忙统计数组中每个数的出现次数。
如果每个数的出现次数都是独一无二的,就返回 true
;否则返回 false
。
示例 1:
输入:arr = [1,2,2,1,1,3]
输出:true
解释:在该数组中,1 出现了 3 次,2 出现了 2 次,3 只出现了 1 次。没有两个数的出现次数相同。
示例 2:
输入:arr = [1,2]
输出:false
示例 3:
输入:arr = [-3,0,1,-3,1,1,1,-3,10,0]
输出:true
提示:
1 <= arr.length <= 1000
-1000 <= arr[i] <= 1000
使用Map方式
思路:
使用Map统计每个元素的出现个数,把统计好的元素个数的值进行去重,比对map和去重后长度是否相同,相同则返回true
小技巧:HashMap的key值不存在重复的原理就是使用set的方式去重
代码:
class Solution {
public boolean uniqueOccurrences(int[] arr) {
boolean result = false;
Map<Integer,Integer> map = new HashMap();
for(int i = 0;i < arr.length; i++){
int key = arr[i];
// map.put(key, map.getOrDefault(key, 0) + 1);
if(map.containsKey(key)){
Integer value = map.get(key);
map.put(key , ++value);
}else{
map.put(key, 1);
}
}
Set<Integer> set = new HashSet();
for(int key : map.keySet()){
set.add(map.get(key));
}
return map.size() == set.size();
//return map.size() == new HashSet<>(map.values()).size();
}
}
复杂度分析:
-
时间复杂度O(N),其中 NN 为数组的长度。遍历原始数组需要 O(N) 时间,而遍历中间过程产生的哈希表又需要 O(N) 的时间。
-
空间复杂度:O(N)。