1207.独一无二的出现次数

🎆 1207.独一无二的出现次数

给你一个整数数组 arr,请你帮忙统计数组中每个数的出现次数。

如果每个数的出现次数都是独一无二的,就返回 true;否则返回 false

注意是元素出现的次数独一无二,而不是元素独一无二

思路

基本思想

为了了解每个元素的出现次数是否唯一,首先肯定需要先统计出元素的出现次数,之后在判断元素的次数是否唯一,所以可以分成两步:

  1. 统计元素的出现次数,为了将元素与其出现的次数对应,所以需要使用一个unordered_map来统计元素出现的次数
  2. 判断元素出现的次数是否唯一,为了判断出现次数是否唯一,需要一个可以快速查询容器中元素是否存在的容器,所以使用unordered_set来判断次数是否唯一

执行流程

  1. 统计元素出现的次数
  2. 将所有出现的次数遍历一遍
    1. 如果在容器中已经找到了相同的出现次数,返回false
    2. 如果没找到相同的出现次数,此时将这个出现次数记录
  3. 继续遍历,直到遍历结束

代码

根据以上分析,得出以下代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public:
    //统计每个数的出现次数是不是独一无二的
    //而不是判断每个数是不是独一无二的
    bool uniqueOccurrences(vector<int>& arr) {
        if(arr.size()==1)
            return true;
        //使用一个map统计元素出现的次数
        unordered_map<int,int> umap;
        for(auto num:arr){
            umap[num]++;
        }
        //使用一个set判断出现的次数是否唯一
        unordered_set<int> uset;
        for(auto it=umap.begin();it!=umap.end();++it){
            //元素出现的次数不唯一
            if(uset.find(it->second)!=uset.end())
                return false;
            else
                uset.insert(it->second);
        }
        return true;
    }
};

总结

主要是统计+判断,使用unordered_set来判断元素出现的次数是否唯一