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

 

示例 1:

输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]

这个II  与I 不同在:      输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。

 350. 两个数组的交集 II_哈希表

to是不包括的

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
        /**
        把短的那个放到哈希表里面
            在遍历长的那个数组, 如果在哈希表里面有,放到结果数组里面,让他的次数-- ,更新map

         */
        HashMap<Integer,Integer> map=new HashMap();
         if(nums1.length>nums2.length){
             return intersect(nums2,nums1);
         }
         //遍历短的数组 放到哈希表里面
         for(int i=0;i<nums1.length;i++){
             map.put(nums1[i],map.getOrDefault(nums1[i],0)+1);
         }
         int res[] =new int [nums1.length];
         //遍历长数组
         int index=0;//记录结果集数组的当前元素所在下标
         for(int i: nums2){
             //如果在哈希表里面有,放到结果数组里面,让他的次数-- ,更新map
            if(map.containsKey(i)){
                res[index++]=i;
                int count=map.get(i)-1;
                if(count>0){
                    map.put(i,count);
                }else{
                    map.remove(i);
                }
                
            }
         }

         //结果都在res里面,但是res里面可能会有空的位置
         int [] ans=Arrays.copyOfRange(res,0,index);
         return ans;
    }
}