题目描述
给你一个整数数组 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
思路
先对数组进行排序
然后创建一个数组用来存储每个数字出现的个数
最后遍历存储出现次数的数组
如果没有相同的就返回true,否则就返回false
(这个解法的执行用时击败了100%的用户,内存消耗击败了69.59%的用户)
C++ 代码
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
sort(arr.begin(), arr.end());
int n = 0;
int a[1001] = {0}; // 存储每个数字出现的次数
a[n] ++;
for(int i = 1; i < arr.size(); i ++)
{
if(arr[i] == arr[i - 1]) // 如果两个数相等就把出现的次数加一
a[n] ++;
else // 如果两个数不相等,就把n加一,使数组的下一位存储下一个数字的出现次数
{
n ++;
a[n] ++;
}
}
for(int i = 0; i <= n; i ++) // 使用两重循环查看有没有重复的出现次数
{
for(int j = i + 1; j <= n; j ++)
if(a[i] == a[j])
return false;
}
return true;
}
};
思路
使用unordered_map[HTML_REMOVED]存储每个数字以及其出现的次数
然后定义一个bool数组用来标记那个次数已经出现了
遍历unordered_map,如果标记数组是true就表明这个次数已经出现过了,就可以推出了
如果是false,就把这个次数更新为true并继续遍历
(执行用时击败47.90%的用户,内存消耗击败32.98%的用户)
(第一个思路中有两层for循环,第二个思路只有一层,但是时间复杂度却有点相反,我也不晓得,我也不敢问,只怪我自己是个傻逼,不会算时间复杂度)
C++ 代码
class Solution {
public:
bool uniqueOccurrences(vector<int>& arr) {
unordered_map<int, int> uma;
bool st[2010] = {false};
for(int i = 0; i < arr.size(); i ++)
{
uma[arr[i]] ++;
}
for(auto s : uma)
{
if(!st[s.second])
{
st[s.second] = true;
}
else
{
return false;
}
}
return true;
}
};
为啥我在力扣提交就爆内存了?
发下代码了,我帮你瞅瞅
没事了,搞定了,脑子日常瓦特