import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * Given two arrays, write a function to compute their intersection.
 * <p>
 * Example:
 * Given nums1 = [1, 2, 2, 1], nums2 = [2, 2], return [2].
 * <p>
 * Note:
 * Each element in the result must be unique.
 * The result can be in any order.
 * <p>
 * Tags: Binary Search, Hash Table, Two Pointers, Sort
 * Similar Problems: (E) Intersection of Two Arrays II
 */
public class IntersectionofTwoArrays {

    /**
     * Two hash sets.
     * One hash set for one array. The other for the intersection.
     */
    public int[] intersection(int[] nums1, int[] nums2) {
        if (nums1.length > nums2.length)
            intersection(nums2, nums1);
        Set<Integer> set = new HashSet<>(nums1.length);
        for (int n : nums1) {
            set.add(n);
        }
        Set<Integer> intersect = new HashSet<>(nums1.length);
        for (int n : nums2) {
            if (set.contains(n)) {
                intersect.add(n);
            }
        }
        int[] result = new int[intersect.size()];
        int i = 0;
        for (Integer num : intersect) {
            result[i++] = num;
        }
        return result;
    }

    /**
     * Java 8 stream.
     * Convert one of the arrays to set using collect.
     * Then generate a distinct filtered stream from the other array.
     */
    public int[] intersectionJava8(int[] nums1, int[] nums2) {
        Set<Integer> set = Arrays.stream(nums2).boxed().collect(Collectors.toSet());
        return Arrays.stream(nums1).distinct().filter(set::contains).toArray();
    }
}

add Intersection of Two Arrays