LC349. 两个数组的交集

/**
     * 方法一
     * 创建set1和set2来装nums1和nums2中的元素
     * 创建set3来装交集数据
     * 我们遍历set1,取出每一个item,如果set2中含有该item,则该item就是set1和set2共有的元素,因此将item放入set3中
     * 最后将set3转换成数组返回
     * @param nums1
     * @param nums2
     * @return
     */
    public static int[] intersection(int[] nums1, int[] nums2) {
        HashSet set1 = new HashSet<>();
        HashSet set2 = new HashSet<>();
        for (int item: nums1) { set1.add(item); }
        for (int item: nums2) { set2.add(item); }
        HashSet set3 = new HashSet<>();
        for (int item: set1) {
            if (set2.contains(item)){
                set3.add(item);
            }
        }
        int[] res = new int[set3.size()];
        int index = 0;
        for (int item: set3) {
            res[index++] = item;
        }
        return res;
    }

    /**
     * 方法二
     * 创建set1和set2 来装nums1和nums2的元素
     * 使用set的retainAll方法,取出set1和set2共同元素
     * @param nums1
     * @param nums2
     * @return
     */
    public static int[] intersection1(int[] nums1, int[] nums2) {
        Set set1 = new HashSet<>();
        Set set2 = new HashSet<>();
        for (int item: nums1) { set1.add(item);}
        for (int item: nums2) { set2.add(item);}
        set1.retainAll(set2);
        int [] res = new int[set1.size()];  
        int index = 0 ;
        for (int item: set1) {
            res[index++] = item;
        }
        return res;
    }

    /**
     * 方法三
     * https://programmercarl.com/0349.%E4%B8%A4%E4%B8%AA%E6%95%B0%E7%BB%84%E7%9A%84%E4%BA%A4%E9%9B%86.html#%E7%AE%97%E6%B3%95%E5%85%AC%E5%BC%80%E8%AF%BE
     * 创建两个数组,因为nums1和nums2中的元素大小在0-1000之间,因此创建一个长度为10001的数组即可
     * 然后遍历两个数组,将nums数组中的元素对应于 hash数组的下标,并+1,因此hash数组中不为0的就表明nums数组中有这个元素
     * 然后两个hash数组对应下标都不为0的就是两个nums数组共有的元素
     *  最后将这些共有元素放入list中,然后转换成数组返回
     * 举例子:
     *      nums1  {1,2,0,4,0,0,0……}
     *      nums2  {2,4,3,0,0,0,0……}
     * hash1 : {1,1,1,0,1}
     * hash2 : {1,0,1,1,1}
     * hash1 和 hash2 对应位置不为0的下标是: 0,2,4
     * 因此元素 0 ,2 , 4 就是相同的元素
     * 使用将这几个元素放入list集合中,然后返回即可
     * @param nums1
     * @param nums2
     * @return
     */
    public static int[] intersection2(int[] nums1, int[] nums2) {
        int [] hash1 = new int[1001];
        int [] hash2 = new int[1001];
        for (int i: nums1) { hash1[i] ++ ; }
        for (int i: nums2) { hash2[i] ++ ; }
        List resList = new ArrayList<>();
        for (int i = 0; i < 1001 ; i++) {
            if (hash1[i] > 0 && hash2[i] > 0){
                resList.add(i);
            }
        }
        int index = 0;
        int res [] = new int[resList.size()];
        for (int item: resList) {
            res[index++] = item;
        }
        return res;
    }

你可能感兴趣的:(java,算法,面试)