(数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】

给定一个整数数组,判断其是否存在两个数的出现次数相同。文章提供了两种方法,一种是直接使用哈希表统计并比较不同次数的数量,另一种是用数组作为哈希来记录频率。最后根据哈希表或数组的大小判断是否所有数的出现次数都独一无二。代码示例给出了Java和C++的实现,并分析了时间复杂度为O(n)。
摘要由CSDN通过智能技术生成

❓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—力扣专栏,每日更新!

注: 如有不足,欢迎指正!
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

酷酷的懒虫

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值