给你一个整数数组 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、求出数组中各元素出现次数放在hash表中
2、判断hash表中的时非0值是否有相同的,如果有相同的返回false
执行结果:
int Compare (const void *a, const void *b)
{
return *(int *)b - *(int *)a;
}
bool uniqueOccurrences(int* arr, int arrSize){
//排序获取每个元素出现的次数,存放在hash表中
qsort(arr, arrSize, sizeof(int), Compare);
int *hash = (int *)malloc(arrSize * sizeof(int));
memset(hash, 0, arrSize * sizeof(int));
int curr = arr[0];
int count = 0;
int num = 0;
int i;
for (i = 0; i < arrSize; i++) {
int temp = arr[i];
if (curr == temp) {
count++;
} else {
hash[num++] = count;
curr = temp;
count = 1;
}
}
hash[num] = count;
// 对元素出现次数进行从大到小排序,即0值全放hash表末尾(无用值)
qsort(hash, arrSize, sizeof(int), Compare);
for (i = 1; i <= num; i++) {
// 当hash值有相同时,则返回false
if (hash[i] == hash[i - 1] && hash[i] != 0) {
return false;
}
}
return true;
}