题目

给你一个整数数组 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. unordered_map<int, int>:用于记录每个元素出现的频率。
  2. unordered_set<int>:用于记录已经出现过的频率。

我们首先遍历数组,统计每个元素出现的频率并存储在frequencyMap中。然后,我们遍历frequencyMap,对于每个出现的频率,如果该频率已经在occurrenceSet中存在,则说明出现的频率不是唯一的,我们返回false。否则,将该频率添加到occurrenceSet中。最后,如果所有频率都是唯一的,则返回true。

在示例代码中,我们使用了一个测试用例arr = {1, 2, 2, 1, 1, 3}进行验证,输出结果为true,说明给定数组中各个元素的频率是唯一的。

请注意,示例代码中使用了C++标准库中的unordered_mapunordered_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;
    }
};