Easy
题目描述
给你一个整数数组 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
解题思路
这道题需要判断数组中每个元素的出现次数是否都不相同。我们可以采用两步解决方案:
解题思路
步骤1:统计频次 使用哈希表统计每个元素在数组中的出现次数。遍历数组,对于每个元素,将其作为键,出现次数作为值存储在哈希表中。
步骤2:检查唯一性 将所有出现次数收集起来,检查是否有重复。可以使用集合(Set)来判断:如果出现次数的个数等于去重后的个数,说明所有出现次数都是唯一的。
算法流程:
- 创建哈希表统计每个元素的出现次数
- 遍历数组,更新哈希表
- 提取所有出现次数到集合中
- 比较原始次数列表长度与集合长度,相等则返回true,否则返回false
这种方法简洁高效,时间复杂度为O(n),空间复杂度为O(n),其中n是数组长度。
代码实现
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
unordered_map<int, int> count;
for (int num : arr) {
count[num]++;
}
unordered_set<int> occurrences;
for (auto& pair : count) {
if (occurrences.count(pair.second)) {
return false;
}
occurrences.insert(pair.second);
}
return true;
}
};
class Solution:
def uniqueOccurrences(self, arr: List[int]) -> bool:
from collections import Counter
count = Counter(arr)
occurrences = list(count.values())
return len(occurrences) == len(set(occurrences))
public class Solution {
public bool UniqueOccurrences(int[] arr) {
Dictionary<int, int> count = new Dictionary<int, int>();
foreach (int num in arr) {
if (count.ContainsKey(num)) {
count[num]++;
} else {
count[num] = 1;
}
}
HashSet<int> occurrences = new HashSet<int>();
foreach (var pair in count) {
if (!occurrences.Add(pair.Value)) {
return false;
}
}
return true;
}
}
var uniqueOccurrences = function(arr) {
const count = new Map();
for (const num of arr) {
count.set(num, (count.get(num) || 0) + 1);
}
const occurrences = new Set();
for (const [key, value] of count) {
if (occurrences.has(value)) {
return false;
}
occurrences.add(value);
}
return true;
};
复杂度分析
| 复杂度类型 | 复杂度 | 说明 |
|---|---|---|
| 时间复杂度 | O(n) | 需要遍历数组一次统计频次,然后遍历频次集合检查唯一性,总体为O(n) |
| 空间复杂度 | O(n) | 最坏情况下哈希表存储n个不同元素,集合也可能存储n个不同的频次 |