#LeetCode刷题——350. 两个数组的交集 II

难度:easy

1、题目介绍

 #LeetCode刷题——350. 两个数组的交集 II_第1张图片

2、思路分析

第一种方法:双指针法

先对俩个数组进行排序,使用俩个指针 i 和 j 不停遍历nums1和nums2,比较俩个元素的值,如果相等就增加到结果集中,如果 nums1[ i ] < nums2 [ j ] ,将 i 后移一位继续比较,如果 nums1[ i ] > nums2 [ j ] , 将 j 后移一位。最终将结果集转换成数组

 #LeetCode刷题——350. 两个数组的交集 II_第2张图片

 

代码: 

   //第一种方法:双指针法
    public static int[] intersect(int[] nums1, int[] nums2) {
        int i = 0;
        int j = 0;
        List rets = new ArrayList<>();
        //对数组进行排序
        Arrays.sort(nums1);
        Arrays.sort(nums2);

        while (i < nums1.length && j < nums2.length) {
            if (nums1[i] == nums2[j]) {
                //如果相等。加入到结果集中
                rets.add(nums1[i]);
                i++;
                j++;
            } else if (nums1[i] > nums2[j]) {
                //不相等,将小的向后移
                j++;
            } else {
                i++;
            }
        }
        //将rets转换成数组
        int[] arr = new int[rets.size()];
        for (int k = 0; k < rets.size(); k++) {
            arr[k] = rets.get(k);
        }
        return arr;
    }

  else if (nums1[i] > nums2[j]) : 这里写 if 是不行的,当 i 和 j 共同后移之后,还会执行i++

第二种方法:哈希表 

  1、先遍历nums1的数组,将数组中的元素保存在map集合的key中,value保存元素出现的次数

  2、遍历nums2数组,判断nums2中的元素是否在nums1中出现过

          (1)如果出现过,将这个元素保存到结果集中,并将出现次数-1 

   3、最终将结果集转换成数组

代码:

     //第二种方法:哈希表
    public static int[] intersect1(int[] nums1,int[] nums2){
        HashMap hashMap = new HashMap<>();
        //保存结果集
        List rets = new ArrayList<>();
        //遍历nums1
        for (int num:nums1) {
            hashMap.put(num,hashMap.getOrDefault(num,0)+1);
        }
        //遍历nums2
        for (int num:nums2) {
            if (hashMap.getOrDefault(num,0) > 0){
                //出现过,将元素保存到结果集中,并将hashMap中元素出现的次数-1
                rets.add(num);
                hashMap.put(num,hashMap.getOrDefault(num,0)-1);
            }
        }
        //将rets转换成数组
        int[] arr = new int[rets.size()];
        for (int i = 0; i < rets.size(); i++) {
            arr[i] = rets.get(i);
        }
        return arr ;

hashMap.getOrDefault()这个函数的作用是检查 HashMap 是否存在特定的键 key。

 如果存在key返回key所对应的value

如果不存在则返回默认值,也就是后面写的 0 

举例说明:

       // 创建一个 HashMap
        HashMap sites = new HashMap<>();
        sites.put(1, "Google");
        sites.put(2, "Runoob");
        sites.put(3, "Taobao");

        // key 的映射存在于 HashMap 中
        String value1 = sites.getOrDefault(1, "Not Found");
        System.out.println("Value for key 1:  " + value1);

        // key 的映射不存在于 HashMap 中
        // 如果 HashMap 中没有该 key,则返回默认值 Not Found
        String value2 = sites.getOrDefault(4, "Not Found");
        System.out.println("Value for key 4: " + value2);

 输出结果:

当题目中需要多次查询数据的时候可以考虑使用哈希表来解决方法 

你可能感兴趣的:(leetcode,算法,数组,哈希表)