1207. 独一无二的出现次数

题目

自己已经走到了怎么求每个数字的出现次数,但是对判断出现次数是否有重复没有好的思路,自己想到的思路就是两重for循环或者先排序再一重for循环,但是感觉这两种都不够好。

于是看了卡哥的讲解,卡哥是用哈希表来判断是否有重复的,此处哈希表用数组来实现,数组下标是某个数字的出现次数,数组值是bool类型,相当于创建了一个从出现次数到该出现次数是否出现的映射(true表示出现了,false表示没出现)

相当于这题用了两次哈希,第一次是从数字到出现次数的映射,第二次是从出现次数到该出现次数是否出现的映射。

结合卡哥的思路写下如下代码:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        int cnt[2010] = {};
        for (auto c : arr)
            ++cnt[c + 1000];
        bool fre[1010] = {};
        for (auto e : cnt)
        {
            if (e)
            {
                if (fre[e] == false)
                    fre[e] = true;
                else
                    return false;
            }
        }
        return true;
    }
};

这个里面还有一个关键点就是题目规定里面有一个条件:-1000 <= arr[i] <= 1000,负数是不能做数组下标的,所以要加上一个偏移量。此时可以定义一个2001大小的数组,例如int count[2010];,统计的时候,将arr[i]统一加1000,这样就可以统计arr[i]的出现频率了。

看了一下官方题解,思路是差不多的,但是代码值得学习。

官方思路:

img

官方代码:

class Solution {
public:
    bool uniqueOccurrences(vector<int>& arr) {
        unordered_map<int, int> occur;
        for (const auto& x: arr) {
            occur[x]++;
        }
        unordered_set<int> times;
        for (const auto& x: occur) {
            times.insert(x.second);
        }
        return times.size() == occur.size();
    }
};

这个代码写法很好的利用了unordered_set的特性。

想要了解一下map、unordered_map、set 和 unordered_set的话可以看看这篇博客 map、unordered_map、set 和 unordered_set的小介绍

posted @ 2024-11-18 19:20  hisun9  阅读(2)  评论(0编辑  收藏  举报