您现在的位置是:首页 >技术教程 >(数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】网站首页技术教程
(数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】
简介(数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】
❓1207. 独一无二的出现次数
难度:简单
给你一个整数数组 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 < = a r r . l e n g t h < = 1000 1 <= arr.length <= 1000 1<=arr.length<=1000
- − 1000 < = a r r [ i ] < = 1000 -1000 <= arr[i] <= 1000 −1000<=arr[i]<=1000
?思路:哈希表
法一:直接使用哈希表
- 首先使用哈希表记录每个数字的出现次数;
- 随后再利用新的哈希表,统计不同的出现次数的数目。
- 如果不同的出现次数的数目等于不同数字的数目,则返回
true
,否则返回false
。
法二:用数组来做哈希
- 此时可以定义一个2001大小的数组
cnts
,存储每个数字的出现次数; - 再定义一个哈希表(数组)
fre
用来记录频率是否重复出现过; - 如果之前出现过,返回
false
; 否则将该频率记标为出现;
?代码:(Java、C++)
法一:直接使用哈希表
Java
class Solution {
public boolean uniqueOccurrences(int[] arr) {
Map<Integer, Integer> cnts = new HashMap<Integer, Integer>();
for (int num : arr) {
cnts.put(num, cnts.getOrDefault(num, 0) + 1);
}
Set<Integer> fre = new HashSet<Integer>();
for (Map.Entry<Integer, Integer> cnt : cnts.entrySet()) {
fre.add(cnt.getValue());
}
return fre.size() == cnts.size();
}
}
C++
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
unordered_map<int, int> cnts;
for(int num : arr){
cnts[num]++;
}
unordered_set<int> fre;
for(auto cnt : cnts){
fre.insert(cnt.second);
}
return fre.size() == cnts.size();
}
};
法二:用数组来做哈希
Java
class Solution {
public boolean uniqueOccurrences(int[] arr) {
int[] cnts = new int[2001]; // 统计数字出现的频率
for (int num : arr) {
cnts[num + 1000]++;
}
boolean[] fre = new boolean[1001]; // 看相同频率是否重复出现
for (int cnt : cnts) {
if (cnt != 0) {
if(fre[cnt]) return false;
else fre[cnt] = true;
}
}
return true;
}
}
C++
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
int cnts[2001] = {0}; // 统计数字出现的频率
for (int num : arr) {
cnts[num + 1000]++;
}
bool fre[1001] = {false}; // 看相同频率是否重复出现
for (int cnt : cnts) {
if (cnt) {
if(fre[cnt]) return false;
else fre[cnt] = true;
}
}
return true;
}
};
? 运行结果:
? 复杂度分析:
- 时间复杂度:
O
(
n
)
O(n)
O(n),其中
n
为数组的长度。遍历原始数组需要 O ( n ) O(n) O(n) 时间,而遍历中间过程产生的哈希表又需要 O ( n ) O(n) O(n) 的时间。法二,需要数组内数值的范围所对应的空间。 - 空间复杂度: O ( n ) O(n) O(n)。
题目来源:力扣。
放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!
注: 如有不足,欢迎指正!
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。