独一无二的出现次数
问题描述:给一个整数数组arr,统计数组中每个数的出现次数。若每个数的出现次数都是独一无二的,返回true;否则返回false;
解决方案:使用哈希表:
首先使用哈希表记下每个数字的出现次数,然后再利用新的哈希表,统计不同的出现次数的数目。如果不同的出现的次数等于不同的数字,则返回true,否则返回false。
哈希表相关知识
1. 概念:
哈希表又叫散列表,思路是,设存储的元素个数为n,设置一个长度为m(m>=n)的里安尼西内存单元,以每个元素的关键字k(i),(0<=i<=n-1)为自变量,通过哈希函数h{k(i)}将k(i)映射到内存的地质单元,,并且把该地址存储在这个单元中,也称为哈希地址,把如此构造成的线性表组合成为哈希表。
2. 构造方法:
(1)、直接选址:
(2)、除留余数法:
(3)、数字分析法:
3. 冲突解决方法:
<1>:开放选址法:
(1)、开放选址法:
(2)、线性探测法:
(3)、平方探测法:
<2>:;拉链法:
本问题相关代码:
struct unordered_set{
int key;
UT_hash_handle hh; //??????
};
struct unordered_map{
int key;
int val;
UT_hash_handle hh;
};
bool uniqueOccurrences(int* arr, int arrSize){
struct unordered_map* occur=NULL;
for(int i=0;i<arrSize;i++)
{
struct unordered_map* tmp=NULL;
HASH_FIND_INT(occur,&arr[i],tmp);
if(tmp==NULL)
{
tmp=malloc(sizeof(struct unordered_map));
tmp->key=arr[i],tmp->val=1;
HASH_ADD_INT(occur,key,tmp);
}
else
{
(tmp->val)++;
}
}
struct unordered_set* times=NULL;
struct unordered_map *cur,*cur_tmp;
HASH_ITER(hh,occur,cur,cur_tmp){
struct unordered_set* tmp=NULL;
HASH_FIND_INT(times,&(cur->val),tmp);
if(tmp==NULL)
{
tmp=malloc(sizeof(struct unordered_set));
tmp->key=cur->val;
HASH_ADD_INT(times,key,tmp);
}
}
return HASH_COUNT(occur)==HASH_COUNT(times);
/*代码来自于leetcode官方*/
}