Leetcode题库 - 两个数组的交集(java语言版)

题目描述:

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

示例 1:

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

示例 2:

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

说明:

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

          本题思路很明确就是判断两个数组中相同的元素,而且这个元素一定是唯一的,这样的话就用到了set。集合的特点就是对放入其中的元素去重。(当然这个地方也可以用到双指针法,就是将最后相同的元素不管重复不重复,放到一个新的数组中,然后对这个数组进行双指针操作,将一个数组看作两个,来去重,但这样的实践复杂度还是O(n)--因为前面要用双重for来判断相同元素,然后在比较,这样没有直接用set来的快)

          第一中思路:双重for将相同的元素放到集合中输出即可;

          第二种方法:用到set中的一个remove方法,(contains也行)。定义两个集合,一个存储数组1中的元素,第二个存储最后相同的元素,当遍历nums2时,判断,如果set1.remove(num2中的元素)成立,则证明num2与num1中的元素相同,然后将这个元素添加进set2 中。

        具体看代码:

第一种方法:

         int [] nums1 = new int[]{4,9,5};
         int [] nums2 = new int[]{9,4,9,8,4};
//         第一种方法,直接用双重for,将nums1与nums相等的元素放到集合中(防止重复),然后输出即可
         Set<Integer> set = new HashSet <> (  );
         for (int i = 0;i<nums1.length;i++){
             for (int j = 0;j<nums2.length;j++){
                 if (nums1[i]==nums2[j]){
                    set.add ( nums1[i] );
                 }
             }
         }
         int nums3[] = new int[set.size ()];
         int n=0;
//         集合遍历赋值给数组
        for (int num:set){
            nums3[n]=num;
            n++;
        }
        for (int num:nums3){
            System.out.println(num);
        }

执行结果:

执行用时:

   第二种方法:

   Set<Integer> set = new HashSet <> (  );
        Set<Integer> set2  = new HashSet <> (  );
        for (Integer num:nums1){
            set.add ( num );
        }
//        遍历nums2
        for (Integer num:nums2){
//            在集合set一中,将数组2中的元素在集合一中若是存在(set.remove去除相同元素为真时),则将这个元素添加到集合2中(num2中的元素在集合set中时,也就是有相同元素)
            if (set.remove ( num )){
                set2.add ( num );
            }

        }
        System.out.println(set2);

    }

执行结果:

执行用时:

总结:这道题用到了set,是一种很好的结构,存储去重有很大的作用。

2019-3-11

发布了43 篇原创文章 · 获赞 6 · 访问量 6669

猜你喜欢

转载自blog.csdn.net/weixin_37850160/article/details/88391632