两个数组的交集

此博客链接:

两个数组的交集

题目链接:

题目

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

示例 1:

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

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

说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。
我们可以不考虑输出结果的顺序。
进阶:

如果给定的数组已经排好序呢?你将如何优化你的算法?
如果 nums1 的大小比 nums2 小很多,哪种方法更优?
如果 nums2 的元素存储在磁盘上,内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

题解

方法一:使用map

先把一个数组的值添加到map中,记录数组中的元素值和对应个数,判断第二个数组中的元素是否在map中,如果在,则取出添加到结果集中,并把map中的value值减一,如果不在,则说明不是两者的交集。

这里有个技巧:把数租少的元素生成键值对,用多的数组去找map中的值。

方法二:使用双指针

定义两个指针分别指向两个数组的头部,判断两个数组中指针所指的元素是否相等,如果相等,则移动双指针,并把元素添加到结果集中,如果那个小,则移动那个指针。

 

代码

方法一

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
       Map <Integer,Integer> map=new HashMap<Integer,Integer>();
       int len1=nums1.length;
       int len2=nums2.length;
       if(len2<len1){
           return intersect(nums2,nums1);
       }
       for(int nums:nums1 )
       {
           int count=map.getOrDefault(nums,0)+1;
           map.put(nums,count);
       }
       int res[]=new int[len1];
       int index=0;
       for(int nums02:nums2 )
       {
           int count=map.getOrDefault(nums02,0);
           if(count>0)
           {
              res[index++]=nums02;
              count--;
              if(count>0)
              {
                  map.put(nums02,count);
              }
              else{
                  map.remove(nums02);
              }
           }
           
       }
       return Arrays.copyOfRange(res, 0, index);
    }
}

 方法2

class Solution {
    public int[] intersect(int[] nums1, int[] nums2) {
       int len1=nums1.length;
       int len2=nums2.length;
       if(len2<len1){
           return intersect(nums2,nums1);
       }
       Arrays.sort(nums1);
       Arrays.sort(nums2);
       int res[]=new int[len1];
       int index=0;
       int left=0;
       int right=0;
      while(left<len1&&right<len2)
       {
           if(nums1[left]<nums2[right])
           {
               left++;
           }
           else if(nums1[left]>nums2[right])
           {
               right++;
           }
           else{
               res[index++]=nums1[left];
               left++;
                right++;
           }
       }
       return Arrays.copyOfRange(res, 0, index);
    }
}

结果

方法一

方法二

出来混总是要还的
原文地址:https://www.cnblogs.com/ping2yingshi/p/15097882.html