题目描述:两个数组的交集

题目来源:leetcode

题目链接:https://leetcode-cn.com/problems/intersection-of-two-arrays/



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

示例 1:

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

示例 2:

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

说明:

输出结果中的每个元素一定是唯一的。我们可以不考虑输出结果的顺序。

双HashSet

做题思路

做这个题目之前我们应该了解一下HashSet的用途,不然代码可能不是特别容易理解。
HashSet 基于 HashMap 来实现的,是一个不允许有重复元素的集合。是无序的,允许有null值。我们把他当成是一个不允许存取重复元素的容器就好。
然后我们来看一下题目描述,他的要求就是我们找出两个数组的交集,重复的时候则只保留一个,比如交集为[2,2]则我们只需输出[2]即可。
因为HashSet是不允许有重复元素的,所以我们先通过HashSet保存数组1的值(去重),然后我们再遍历数组2,判断HashSet里是否有数组2的值,如果含有则说明该值在两个数组都出现了,则保存到动态数组中。然后remove掉出现过的值,(可以看代码注释)遍历结束后,动态数组中保存的则是去重后的子集。该方法接近双100,还是挺不错的方法。

题目代码

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
         if(nums1.length == 0 || nums2.length == 0){
              int[] arr = new int[0];
              return arr;
         }
         //用来保留num1的去重结果
         HashSet<Integer> num1set = new HashSet<Integer>();
         //用来保存查询到的子集,动态数组,因为最后返回值是数组,
         //但是我们现在不知道子集的元素有多少个,所以不可以直接定义数组
         ArrayList<Integer> childarr = new ArrayList<Integer>(); 
         //将数组1的值存到HashSet里      
         for(int i = 0 ;i < nums1.length ; i++){
             num1set.add(nums1[i]);
         }
         //遍历数组2,判断是否在1中出现
         for(int j = 0; j<nums2.length;j++){
             if(num1set.contains(nums2[j])){
                 childarr.add(nums2[j]);
                 //这个是关键,防止重复插入,因为数组2里可能会有重复值。
                 //例num1=[1,2,1,3],num2=[2,1,1,4],子集为[1,2],HashSet值为[1,2,3]
                 //但是我们不加这一行的话,当我们遍历数组2,遍历到第一个1时,插入,第二个1仍会插入,
                //所以需要remove出现过的值。
                 num1set.remove(nums2[j]);
             }
         }
         //将arraylist元素保存到数组中
         int[] renum = new int[childarr.size()];
         for(int i = 0 ;i<childarr.size();i++){
             renum[i] = childarr.get(i); 
         }
         return renum;
    }
}