题目
给你一个整数数组 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
解答
解题思路: 该问题要求判断给定数组中各个元素出现的频率是否唯一。
我们可以使用两个数据结构来解决这个问题:
unordered_map<int, int>
:用于记录每个元素出现的频率。unordered_set<int>
:用于记录已经出现过的频率。
我们首先遍历数组,统计每个元素出现的频率并存储在frequencyMap
中。然后,我们遍历frequencyMap
,对于每个出现的频率,如果该频率已经在occurrenceSet
中存在,则说明出现的频率不是唯一的,我们返回false。否则,将该频率添加到occurrenceSet
中。最后,如果所有频率都是唯一的,则返回true。
在示例代码中,我们使用了一个测试用例arr = {1, 2, 2, 1, 1, 3}
进行验证,输出结果为true
,说明给定数组中各个元素的频率是唯一的。
请注意,示例代码中使用了C++标准库中的unordered_map
和unordered_set
来实现哈希表和哈希集合的功能。
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
unordered_map<int, int> frequencyMap; // 存储每个元素出现的频率
unordered_set<int> occurrenceSet; // 存储出现的频率值
// 计算每个元素出现的频率
for (int num : arr) {
frequencyMap[num]++;
}
// 检查频率是否是唯一的
for (auto it = frequencyMap.begin(); it != frequencyMap.end(); ++it) {
int occurrence = it->second;
// 如果出现的频率已经存在,返回false
if (occurrenceSet.count(occurrence) > 0) {
return false;
}
// 将出现的频率添加到集合中
occurrenceSet.insert(occurrence);
}
// 所有频率都是唯一的,返回true
return true;
}
};