【349. 两个数组的交集】

349. 两个数组的交集

1.题目描述

 给定两个数组 nums1 和 nums2 ,返回 它们的交集 。
 输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
 
 输入:nums1 = [1,2,2,1], nums2 = [2,2]
 输出:[2]

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

2.解题思路及代码

  • 方法一:哈希表法

思路:利用哈希表(不包含重复元素的特点)
1,先将一个数组放入set集合,然后遍历另一个数组。
2,如果第一个set集合包含第二数组元素,则放入结果set1集合中。
3,最后在将set1集合转化为int数组。
4,将set集合中的元素转化为数组输出。

具体代码如下:

 public int[] intersection(int[] nums1, int[] nums2) {
        Set<Integer> set=new HashSet<>();
        Set<Integer> set1=new HashSet<>();
        for (int i = 0; i <nums1.length ; i++) {
            if (!set.contains(nums1[i])){
                set.add(nums1[i]);
            }
        }
        for (int j=0;j<nums2.length;j++){
            if (set.contains(nums2[j])){
                if (!set1.contains(nums2[j])){
                    set1.add(nums2[j]);
                }
            }
        }
        int[] result=SetToInt(set1);
        return result;
    }
    private static int[] SetToInt(Set<Integer> allSet) {
        // 先将set集合转为Integer型数组
        Integer[] temp = allSet.toArray(new Integer[] {});//关键语句

        // 再将Integer型数组转为int型数组
        int[] intArray = new int[temp.length];
        for (int i = 0; i < temp.length; i++) {
            intArray[i] = temp[i].intValue();
        }
        return intArray;
    }

时间复杂度:O(n)
空间复杂度:O(n)

  • 方法二:排序+双指针

思路:
1,首先对两个数组进行排序
2,然后利用两个指针分别指向排序后的两个数组的起始0
3,最后,比较对应元素的大小,来移动相应的指针,其中需要判断是否已经加过相同元素的操作,只需要取前一个元素比较即可。

具体代码如下:

public int[] intersection(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        int length1 = nums1.length, length2 = nums2.length;
        int[] intersection = new int[length1 + length2];
        int index = 0, index1 = 0, index2 = 0;
        while (index1 < length1 && index2 < length2) {
            int num1 = nums1[index1], num2 = nums2[index2];
            if (num1 == num2) {
                // 保证加入元素的唯一性
                if (index == 0 || num1 != intersection[index - 1]) {
                    intersection[index++] = num1;
                }
                index1++;
                index2++;
            } else if (num1 < num2) {
                index1++;
            } else {
                index2++;
            }
        }
        return Arrays.copyOfRange(intersection, 0, index);
    }

时间复杂度:O(nlogn)
空间复杂度:O(logn)

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值