两个阵列的交集

时间:2016-06-03 04:24:31

标签: java algorithm

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

实施例: 给定nums1 = [1,2,2,1],nums2 = [2,2],返回[2]。

注意

  • 结果中的每个元素都必须是唯一的。
  • 结果可以是任何顺序。

我通过以下代码解决它:

public int[] intersection(int[] nums1, int[] nums2) {
    if(nums1.length==0 || nums2.length==0){
            return new int[0];
    }
    Arrays.sort(nums1);
    Arrays.sort(nums2);

    ArrayList<Integer> list = new ArrayList();
    int len1 = nums1.length;
    int len2 = nums2.length;
    int i1 = 0;
    int i2 = 0;
    while(i1<len1 && i2<len2){
        if(nums1[i1]==nums2[i2]){
            if(!list.contains(nums1[i1]))
                list.add(nums1[i1]);
            i1 ++ ;
            i2 ++;
        }else if(nums1[i1]>nums2[i2]){
            i2 ++;
        }else {
            i1 ++;
        }
    }
    int result[] = toIntArray(list);
    return result;
}
int[] toIntArray(List<Integer> list)  {
    int[] ret = new int[list.size()];
    int i = 0;
    for (Integer e : list)  
        ret[i++] = e.intValue();
    return ret;
}

首先我对两个数组进行排序。然后我查看了数组。我认为有一个更好的解决方案

3 个答案:

答案 0 :(得分:4)

如果您被允许使用哈希集,那么非常简单,因为a.retainAll(b)会导致a intersect b

public Integer[] intersection(int[] nums1, int[] nums2) {

    HashSet<Integer> set1 = new HashSet<>();
    for(int i : nums1) {
        set1.add(i);
    }

    HashSet<Integer> set2 = new HashSet<>();
    for(int i : nums2) {
        set2.add(i);
    }

    set1.retainAll(set2);

    return set1.toArray(new Integer[set1.size()]);
}

答案 1 :(得分:2)

如果您使用

,这是一个解决方案
Arrays.stream(arr1)
        .filter(x -> Arrays.stream(arr2)
                .anyMatch(y -> y == x)
        )
        .distinct()
        .forEach(System.out::println);

以下是实现相同的方法:

public static int[] intersection(int[] a, int[] b) {
    return Arrays.stream(a)
            .filter(x -> Arrays.stream(b)
                    .anyMatch(y -> y == x)
            )
            .distinct()
            .toArray();
}

答案 2 :(得分:0)

是的,有:

public Integer[] intersection(int[] nums1, int[] nums2) 
{

    ArrayList<Integer> list = new ArrayList();
    int len1 = nums1.length;
    int len2 = nums2.length;
    int k = 0;

    for(int i = 0;i<Java.lang.Math.min(len1,len2);i++)
        for(int j = 0;j<Java.lang.Math.min(len1,len2);j++)
            if(nums1[i] == nums2[j] && !list.contains(new Integer(nums1[i])))
                list.add(k++,nums1[i]);

     return list.toArray(new Integer[foo.size()]);
 }