至少在两个数组中出现的值
难度:
标签:
题目描述
代码结果
运行时间: 26 ms, 内存: 16.1 MB
/*
* 思路:
* 1. 使用流处理集合,计算每个元素在多个数组中的出现次数。
* 2. 过滤出现次数大于1的元素,最终转换为列表。
*/
import java.util.*;
import java.util.stream.*;
public class SolutionStream {
public List<Integer> twoOutOfThree(int[] nums1, int[] nums2, int[] nums3) {
Map<Integer, Integer> countMap = new HashMap<>();
// 统计每个数字出现的数组个数
Arrays.stream(nums1).distinct().forEach(num -> countMap.put(num, countMap.getOrDefault(num, 0) + 1));
Arrays.stream(nums2).distinct().forEach(num -> countMap.put(num, countMap.getOrDefault(num, 0) + 1));
Arrays.stream(nums3).distinct().forEach(num -> countMap.put(num, countMap.getOrDefault(num, 0) + 1));
// 过滤出出现次数大于1的数字
return countMap.entrySet().stream()
.filter(entry -> entry.getValue() > 1)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
}
}
解释
方法:
该题解首先将每个数组转换为一个集合,以消除重复元素并便于后续操作。接着,计算这三个集合间任意两个集合的交集,即分别计算集合1和集合2、集合1和集合3、以及集合2和集合3的交集。这三个交集包含了至少在两个数组中出现的所有唯一值。最后,通过合并这三个交集,得到一个包含所有符合条件的元素的集合,然后将该集合转换为列表并返回。
时间复杂度:
O(n + m + k)
空间复杂度:
O(1)
代码细节讲解
🦆
为什么在实现时选择使用集合而不是其他数据结构,例如列表或字典?
▷🦆
题解中提到的三个交集操作是并行执行的还是连续执行的?这种执行方式对性能有何影响?
▷🦆
合并三个交集后,是否可能出现重复元素需要再次去重,或者集合的特性已经自动处理了这一点?
▷