Skip to main content

1207.独一无二的出现次数

力扣题目链接leetcode.cn力扣题目链接/problems/unique-number-of-occurrences/

给你一个整数数组 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

思路

这道题目数组在是哈希法中的经典应用,如果对数组在哈希法中的使用还不熟悉的同学可以看这两篇:数组在哈希法中的应用programmercarl.com数组在哈希法中的应用/0242.有效的字母异位词.html哈希法:383. 赎金信programmercarl.com哈希法:383. 赎金信/0383.赎金信.html

进而可以学习一下set在哈希法中的应用programmercarl.comset在哈希法中的应用/0349.两个数组的交集.html,以及map在哈希法中的应用programmercarl.commap在哈希法中的应用/0001.两数之和.html

回归本题,本题强调了-1000 <= arr[i] <= 1000,那么就可以用数组来做哈希,arr[i]作为哈希表(数组)的下标,那么arr[i]可以是负数,怎么办?负数不能做数组下标。

此时可以定义一个2001大小的数组,例如int count[2001];,统计的时候,将arr[i]统一加1000,这样就可以统计arr[i]的出现频率了。

题目中要求的是是否有相同的频率出现,那么需要再定义一个哈希表(数组)用来记录频率是否重复出现过,bool fre[1001]; 定义布尔类型的就可以了,因为题目中强调1 <= arr.length <= 1000,所以哈希表大小为1000就可以了

如图所示:

C++代码如下:

C++
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
int count[2001] = {0}; // 统计数字出现的频率
for (int i = 0; i < arr.size(); i++) {
count[arr[i] + 1000]++;
}
bool fre[1001] = {false}; // 看相同频率是否重复出现
for (int i = 0; i <= 2000; i++) {
if (count[i]) {
if (fre[count[i]] == false) fre[count[i]] = true;
else return false;
}
}
return true;
}
};

其他语言版本

Java
class Solution {
public boolean uniqueOccurrences(int[] arr) {
int[] count = new int[2001];
for (int i = 0; i < arr.length; i++) {
count[arr[i] + 1000]++; // 防止负数作为下标
}
boolean[] flag = new boolean[1002]; // 标记相同频率是否重复出现
for (int i = 0; i <= 2000; i++) {
if (count[i] > 0) {
if (flag[count[i]] == false) {
flag[count[i]] = true;
} else {
return false;
}
}
}
return true;
}
}