您现在的位置是:首页 >技术教程 >(数组) 1207. 独一无二的出现次数 ——【Leetcode每日一题】网站首页技术教程

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

酷酷的懒虫 2024-09-30 12:01:05
简介(数组) 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—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。