350. Intersection of Two Arrays II

<Sort>350. Intersection of Two Arrays II_第1张图片
image.png

这道题和349很相似,同样是求交集,但是要求有所不同。输出结果中的元素可以重复,输出数组可以无序。

解法一:使用哈希表

用哈希表来建立nums1中字符和其出现个数之间的映射, 然后遍历nums2数组,如果当前字符在哈希表中的个数大于0,则将此字符加入结果中,然后哈希表的对应值自减1,参见代码如下:

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        HashMap map = new HashMap();
        for(Integer num: nums1)
            map.put(num, map.getOrDefault(num, 0) + 1);
                int count = 0;
        for (Integer num : nums2) {
            if (map.containsKey(num) && map.get(num) > 0) {
                nums1[count++] = num;
                map.put(num, map.get(num) - 1);
            }
        }
        return Arrays.copyOf(nums1, count);
    }
}

几个关键点总结:

  1. 由于输出数组中的元素可以重复且无序,数据那么数据结构选择哈希表HashMap。
    2. map.put(num, map.getOrDefault(num, 0) + 1); //如果没有这个元素,则加入该元素,并且将出现次数设为1,若已有该元素,给元素数量加1。一种很简洁很方便的方法。Map.getOrDefault(Object key, V defaultValue)方法:当Map集合中有这个key时,就使用这个key值,如果没有就使用默认值defaultValue。
    3.该代码最后返回的时候使用了数组的拷贝的方式。Arrays.copyOf(array, count)。

解法二:排序+双指针

解题思路:
1)对数组nums1进行排序;
2)对数组nums2进行排序;
3)遍历数组nums1和nums2中元素,并比较对应的元素,
若相等,则将其保存到输出结果中,并变化两个数组对应的索引
不等,则变化较小元素对应的索引即可。代码如下:

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        ArrayList result = new ArrayList();
        for(int i =0, j = 0; i < nums1.length && j < nums2.length; ){
            if(nums1[i] == nums2[j]){
                result.add(nums1[i]);
                i++;
                j++;
            }
            else if(nums1[i] < nums2[j]){
                i++;
            }
            else
                j++;              
        }
    int[] res = new int[result.size()];
    for(int i = 0; i < result.size(); i++){
        res[i] = (int) result.get(i);
    }
    return res;
    }
}

几个关键点总结:

  1. 利用Arrays.sort方法直接对数据排序
  2. 双指针的思想
    .

你可能感兴趣的:(350. Intersection of Two Arrays II)