力扣: 两个数组的交集

发布于:2024-09-18 ⋅ 阅读:(10) ⋅ 点赞:(0)

在这里插入图片描述


需求

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

1 <= nums1.length, nums2.length <= 1000
0 <= nums1[i], nums2[i] <= 1000


set 解决

题意很简单, 甚至不用过多的去想:

public int[] intersection(int[] nums1, int[] nums2) {
    //  将数组1放进集合里
    Set<Integer> set = new HashSet(nums1.length);
    for( int i = 0; i < nums1.length; i++ ){
        set.add(nums1[i]);
    }
    Set<Integer> res = new HashSet();
    for( int i = 0; i < nums2.length; i++ ){
        if( set.contains(nums2[i]) ){
            res.add(nums2[i]);
        }
    }
    return res.stream().mapToInt(Integer::intValue).toArray();
}

代码解释:
初始化 set 集合:
Set<Integer> set = new HashSet(nums1.length);
创建一个 HashSet,用于存储 nums1 中的元素。HashSet 是一种基于哈希表的集合,提供常数时间的查找、插入和删除操作。

将 nums1 的元素添加到 set 中:
for (int i = 0; i < nums1.length; i++) { set.add(nums1[i]); }
遍历 nums1 数组,将每个元素添加到 set 中。由于 HashSet 自动处理重复元素,最终 set 中将包含 nums1 中所有不重复的元素。

初始化 res 集合:
Set<Integer> res = new HashSet();
创建一个新的 HashSet,用于存储 nums1 和 nums2 的交集。

检查 nums2 中的元素是否在 set 中:
for (int i = 0; i < nums2.length; i++) { if (set.contains(nums2[i])) { res.add(nums2[i]); } }
遍历 nums2 数组,检查 nums2 中的每个元素是否存在于 set 中。如果存在,则将该元素添加到 res 集合中。这样,res 中将包含 nums1 和 nums2 的共同元素。

将 res 转换为整数数组并返回:
return res.stream().mapToInt(Integer::intValue).toArray();
将 res 集合转换为 int 类型的数组。stream() 方法将集合转换为流,mapToInt(Integer::intValue) 将每个 Integer 对象转换为 int 类型,toArray() 将流转换为数组。


执行结果:

在这里插入图片描述


数组解决

通过使用一个大小固定的数组 arr1 和一个 HashSet 来找到两个数组的交集。利用数组索引的特性来标记 nums1 中的元素,从而在检查 nums2 中的元素时能快速判断是否存在于 nums1 中。这种方法的时间复杂度为 O(n + m),其中 n 和 m 分别是 nums1 和 nums2 的长度。

public int[] intersection(int[] nums1, int[] nums2) {
    Set<Integer> res = new HashSet<>();
    int[] arr1 = new int[1001];
    for (int num : nums1) {
        arr1[num] = 1;
    }
    for (int num : nums2) {
        if( arr1[num] == 1 ){
            res.add(num);
        }
    }
    return res.stream().mapToInt(Integer::intValue).toArray();
}

优点
空间复杂度较低,因为使用了一个大小固定的数组(假设元素范围已知)。
不需要处理哈希冲突等问题,简单高效。

缺点
适用范围有限,假设元素的取值范围在 [0, 1000] 之间。如果输入数据的范围非常大或者是不连续的,这种方法就不适用了。

执行结果:

在这里插入图片描述


结尾

以上 是我对这道算法的一些遐想和延伸, 可能不是最优解, 但是算法的优化嘛 本身就是一个思索的过程, 能在这个思索和迭代的过程中有所收获和乐趣就是在成长了, 欢迎大家一起来交流更多的解答…