加载中...
1207-独一无二的出现次数(Unique Number of Occurrences)
发表于:2021-12-03 | 分类: 简单
字数统计: 903 | 阅读时长: 4分钟 | 阅读量:

原文链接: https://leetcode-cn.com/problems/unique-number-of-occurrences

英文原文

Given an array of integers arr, return true if the number of occurrences of each value in the array is unique, or false otherwise.

 

Example 1:

Input: arr = [1,2,2,1,1,3]
Output: true
Explanation: The value 1 has 3 occurrences, 2 has 2 and 3 has 1. No two values have the same number of occurrences.

Example 2:

Input: arr = [1,2]
Output: false

Example 3:

Input: arr = [-3,0,1,-3,1,1,1,-3,10,0]
Output: true

 

Constraints:

  • 1 <= arr.length <= 1000
  • -1000 <= arr[i] <= 1000

中文题目

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

通过代码

高赞题解

1,先计算每个数出现的次数,再存放到集合set中,判断长度

第一步都是要先计算每个数出现的次数。后面的只需要判断这个出现次数的数组中元素是否有重复的即可。

我们知道集合set是不能有重复元素的,如果有就会替换掉,我们可以把出现次数的数组放到集合set中,如果有重复的就会被替换掉,那么set的大小肯定和出现次数的数组长度不一样。否则如果没有重复的,他们的长度肯定是一样的,看下代码

public boolean uniqueOccurrences(int[] arr) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < arr.length; i++) {
        map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
    }
    return map.size() == new HashSet<>(map.values()).size();
}

再来看下运行结果
image.png


2,先计算每个数出现的次数,再逐步存放到集合中,判断是否存放成功

在set集合中如果有相同的元素,就会存储失败,返回false,每次存储的时候我们只要判断是否存储成功即可,代码如下

public boolean uniqueOccurrences(int[] arr) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int i = 0; i < arr.length; i++) {
        map.put(arr[i], map.getOrDefault(arr[i], 0) + 1);
    }
    Set<Integer> set = new HashSet<>();
    for (int value : map.values()) {
        if (!set.add(value))//如果存储失败,说明有重复的
            return false;
    }
    return true;
}

3,使用数组

题中提示中数组的大小和长度都有了限制,所以我们还可以使用数组。

public boolean uniqueOccurrences(int[] arr) {
    int[] count = new int[2001];
    for (int i = 0; i < arr.length; i++) {
        count[1000 + arr[i]]++;
    }
    Set<Integer> set = new HashSet<>();
    for (int value : count) {
        if (value == 0)
            continue;
        if (!set.add(value))//如果存储失败,说明有重复的
            return false;
    }
    return true;
}

看下运行结果
image.png


上面3种方式其实没啥区别,乍一看这题这么简单,我以为会有特殊的解题技巧,想了半天也没想出来,可能就是这么简单吧
**如果觉得有用就给个赞吧,你的赞是给我最大的鼓励,也是我写作的最大动力**

统计信息

通过次数 提交次数 AC比率
60890 83401 73.0%

提交历史

提交时间 提交结果 执行时间 内存消耗 语言
上一篇:
1195-交替打印字符串(Fizz Buzz Multithreaded)
下一篇:
1208-尽可能使字符串相等(Get Equal Substrings Within Budget)
本文目录
本文目录