349. 两个数组的交集

发布于:2022-11-04 ⋅ 阅读:(287) ⋅ 点赞:(0)

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

第一种

public static int[] intersection(int[] nums1, int[] nums2) {
        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]);
                    break;
                }
            }
        }
        Object[] obj = set.toArray();
        int temp[] = new int[obj.length];
        for (int i = 0; i < obj.length; i++) {
            temp[i] = (int) obj[i];
            System.out.print(temp[i] + " ");
        }
        return temp;
    }

利用set集合的性质,set集合中的元素都是唯一的,通过双循环找到相同的数即可,这样比较费时间,但是比较容易理解
在这里插入图片描述

第二种:排序+双指针

public static int[] intersection2(int[] nums1, int[] nums2) {
        Arrays.sort(nums1);
        Arrays.sort(nums2);
        Set<Integer> set = new HashSet<>();

        int i = 0;
        int j = 0;
        while (i < nums1.length && j < nums2.length) {
            if(nums1[i] == nums2[j]) {
                set.add(nums1[i]);
                i++;
                j++;
            }else {
                if(nums1[i] < nums2[j]) {
                    i++;
                } else {
                    j++;
                }
            }
        }
        Object[] obj = set.toArray();
        int temp[] = new int[obj.length];
        for (int k = 0; k < obj.length; k++) {
            temp[k] = (int) obj[k];
        }
        return temp;
    }

先对数组进行排序,然后用两个不同的指针分别指向数组的头部,如何两个数组中的元素相同,则将该元素放入到set中,如果不同,就需要将数小的那个指针向后移一位,因为数组是有序的,大的数都在后面,那么想要找到和当前数相同的,就需要指针向后移动。

在这里插入图片描述

这个时间效率显而易见


网站公告

今日签到

点亮在社区的每一天
去签到