算法~求数组的交集

126 阅读1分钟

给定两个数组,编写一个函数来计算它们的交集

  • 描述
    • leetCode:leetcode-cn.com/problems/in…
    • 输入:nums1 = [1,2,2,1], nums2 = [2,2] 输出: [2]
    • 输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4] 输出: [9,4]
  • 说明
    • 输出结果中的每个元素一定是唯一的
    • 我们可以不考虑输出结果的顺序
  • 解题思路
    • 由于Set元素不可重复,故可将数组1遍历后存储进Set1,然后遍历数组2并使用Set1的contains方法逐个调用,包含时加入到Set2中,最终把Set2转换为数组即可
    • 时间复杂度 O(m+n);空间复杂度O(m+n)
    • Java代码实现:
/**
* 求两个数组的交集
*
* @param array1 数组1
* @param array2 数组2
* @return 数组的交集
*/
private static int[] getIntersection1(int[] array1, int[] array2) {
   if (array1 == null || array1.length == 0 || array2 == null || array2.length == 0) {
       return null;
   }

   Set<Integer> set1 = new HashSet<>();
   Set<Integer> set2 = new HashSet<>();
   Arrays.stream(array1).forEach(set1::add);
   Arrays.stream(array2).forEach(i -> {
       if (set1.contains(i)) {
           set2.add(i);
       }
   });
   return set2.stream().mapToInt(Integer::intValue).toArray();
}

延伸:假如给定的是两个有序数组

  • 描述

    • 输入:nums1 = [1,2,4,8], nums2 = [2,5] 输出: [2]
  • 解题思路

    • 做while循环,条件是数组1的下边index1 < 数组1.length 并且 数组2的下边index2 < 数组2.length,执行体中对相应下标下的值作比较,相等添加进Set集合中表示交集,并对index1++,index2++;array1[index1]>array2[index2]时对index2++,小于时index1++,最终将set转为数组即可。
    • 时间复杂度 O(max(m,n));空间复杂度O(min(m,n))
    • Java代码实现:
private static int[] getIntersection2(int[] array1, int[] array2) {
    if (array1 == null || array1.length == 0 || array2 == null || array2.length == 0) {
        return null;
    }

    int index1 = 0, index2 = 0;
    Set<Integer> set = new HashSet<>();
    while (index1 < array1.length && index2 < array2.length) {
        if (array1[index1] < array2[index2]) {
            index1++;
        } else if (array1[index1] == array2[index2]) {
            set.add(array1[index1]);
            index1++;
            index2++;
        } else {
            index2++;
        }
    }

    return set.stream().mapToInt(Integer::intValue).toArray();
}