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]
的出现频率了。
看了一下官方题解,思路是差不多的,但是代码值得学习。
官方思路:
官方代码:
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的小介绍