独一无二的出现次数
难度:
标签:
题目描述
代码结果
运行时间: 19 ms, 内存: 16.2 MB
/*
* 思路:
* 1. 使用流操作统计每个元素的出现次数。
* 2. 使用一个集合来存储每个出现次数,如果添加失败,则说明出现次数不是唯一的,返回false。
* 3. 如果遍历结束后,所有出现次数都是唯一的,返回true。
*/
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map;
import java.util.stream.Collectors;
public class UniqueOccurrencesStream {
public boolean uniqueOccurrences(int[] arr) {
Map<Integer, Long> countMap = Arrays.stream(arr)
.boxed()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
HashSet<Long> occurrences = new HashSet<>();
return countMap.values().stream().allMatch(occurrences::add);
}
public static void main(String[] args) {
UniqueOccurrencesStream solution = new UniqueOccurrencesStream();
int[] arr1 = {1, 2, 2, 1, 1, 3};
System.out.println(solution.uniqueOccurrences(arr1)); // true
int[] arr2 = {1, 2};
System.out.println(solution.uniqueOccurrences(arr2)); // false
int[] arr3 = {-3, 0, 1, -3, 1, 1, 1, -3, 10, 0};
System.out.println(solution.uniqueOccurrences(arr3)); // true
}
}
解释
方法:
这个题解通过一个字典来统计每个数在数组中的出现次数。每次遍历到一个数,如果这个数已经存在于字典中,则将其对应的值加1;如果不存在,则初始化其值为1。之后,这个解法利用集合来检查所有的出现次数是否唯一。将字典的值(即每个数字的出现次数)转化为一个集合,如果集合的大小与字典中值的数量相同,则说明没有重复的出现次数,返回true;否则,返回false。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
题解中使用了字典和集合两种数据结构,能否详细解释它们在此算法中各自的作用和优势?
▷🦆
解法中提到集合的大小与字典中值的数量相同则返回true,这种方法是否能处理所有边界情况,比如数组为空或数组只有一个元素的情况?
▷🦆
如果在统计过程中发现某两个数字的出现次数相同,是否有更快的方法提前结束程序执行?
▷