Bootstrap

两个数组的交集力扣--349

目录

题目

思路

set

数组

代码

set 

数组 


题目

给定两个数组 nums1 和 nums2 ,返回 它们的 交集

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

示例 1:

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

示例 2:

输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
解释:[4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

 

思路

原题是没有给定数组范围,如果用数组的话空间浪费,所以用set

set

  • 先遍历一个数组,把他出现过的记录下来,存在一个set里
  • 然后在遍历另一个,看他的元素是否包含在set中,如果在,就放在另一个set里
  • 最后返回的形式是一个数组,所以要把它转化为数组的形式

 

数组

定义的大小只需要比题目给的1000大一点就可以了

代码

set 

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        if(nums1==null||nums1.length==0||nums2==null||nums2.length==0){
            return new int[0];//有一个为空,那么不可能出现交集的情况
        }
       Set<Integer> set1=new HashSet<>();//用一个来存储他出现过什么
       Set<Integer> set2=new HashSet<>();//另一个存储最后结果
       for(int i:nums1){
        set1.add(i);//遍历第一个数组,把出现了的加到这个set集合中
       }
       for(int j:nums2){
        if(set1.contains(j)){//遍历第二个数组,如果包含他,那么就是交集,添加
            set2.add(j);
        }
       }
       int[] arr=new int[set2.size()];//最后返回的是数组的形式可以新创建一个数组然后返回
       int j=0;
       for(int i:set2){
        arr[j++]=i;
       }
       return arr;
    }
}

数组 

class Solution {
    public int[] intersection(int[] nums1, int[] nums2) {
        int[] hash1 = new int[1002];
        int[] hash2 = new int[1002];
        for(int i : nums1)
            hash1[i]++;
        for(int i : nums2)
            hash2[i]++;
        List<Integer> resList = new ArrayList<>();
        for(int i = 0; i < 1002; i++)
            if(hash1[i] > 0 && hash2[i] > 0)
                resList.add(i);
        int index = 0;
        int res[] = new int[resList.size()];
        for(int i : resList)
            res[index++] = i;
        return res;
    }
}

 

;