返回

洞悉LeetCode交集玄机:数组交集轻松拿捏!

见解分享

两个数组的交集:在 LeetCode 中烹饪美味

踏入 LeetCode 的迷人世界,那里每日一题如同一盘盘待品尝的美味佳肴,而今天,我们准备了一道开胃菜:两个数组的交集 II

品味题目

假设有两个数组 nums1nums2,请找出它们的交集,但与通常的交集不同的是,每个元素在结果数组中出现的次数应与在两个数组中出现次数最少的那个数组中相同。

例如:

  • nums1 = [1, 2, 2, 1], nums2 = [2, 2],返回 [2, 2]
  • nums1 = [4, 9, 5], nums2 = [9, 4, 9, 8, 4],返回 [4, 9]

思考过程

这道题目考验了我们对集合论和编程算法基础的理解。集合论中,交集是指两个集合中同时包含的元素的集合。而本题中,我们需要找到两个数组中共同存在的元素,且其出现次数与出现次数最少的数组中的次数相同。

烹饪方法

解决这个问题有两种主要方法:哈希表法和双指针法。

哈希表法:精准识别

哈希表法是一种经典的解决方案。我们可以创建一个哈希表,其中 nums1 中的每个元素作为键,出现次数作为值。然后,遍历 nums2,对于每个元素,如果它在哈希表中,则将其值减一。如果减一后该元素的值为 0,则将其从哈希表中删除。

最后,我们将哈希表中的键值对重新转换为数组,就是所求的交集数组。

双指针法:并驾齐驱

双指针法是一种更简单的方法。我们可以将两个数组排序,然后使用两个指针分别指向两个数组的第一个元素。如果两个指针指向的元素相同,则将其添加到交集数组中,并同时移动两个指针。如果两个指针指向的元素不同,则移动指向较小元素的指针。

重复以上步骤,直到两个指针都指向数组末尾。此时,交集数组就是所求结果。

代码示例

// 哈希表法
int[] intersect1(int[] nums1, int[] nums2) {
    Map<Integer, Integer> map = new HashMap<>();
    for (int num : nums1) {
        map.put(num, map.getOrDefault(num, 0) + 1);
    }

    Set<Integer> set = new HashSet<>();
    for (int num : nums2) {
        if (map.containsKey(num) && map.get(num) > 0) {
            set.add(num);
            map.put(num, map.get(num) - 1);
        }
    }

    int[] result = new int[set.size()];
    int index = 0;
    for (int num : set) {
        for (int i = 0; i < map.get(num); i++) {
            result[index++] = num;
        }
    }

    return result;
}

// 双指针法
int[] intersect2(int[] nums1, int[] nums2) {
    Arrays.sort(nums1);
    Arrays.sort(nums2);

    int[] result = new int[Math.min(nums1.length, nums2.length)];
    int index = 0;

    int i = 0, j = 0;
    while (i < nums1.length && j < nums2.length) {
        if (nums1[i] == nums2[j]) {
            result[index++] = nums1[i];
            i++;
            j++;
        } else if (nums1[i] < nums2[j]) {
            i++;
        } else {
            j++;
        }
    }

    return Arrays.copyOfRange(result, 0, index);
}

总结

两个数组的交集 II 是 LeetCode 中一道经典的编程算法题目,考察了我们对集合论和算法基础的掌握程度。我们可以使用哈希表法或双指针法来解决这个问题,每种方法都有其优缺点。掌握这些算法不仅能帮助我们在 LeetCode 中取得成功,也能提高我们作为程序员的整体能力。

常见问题解答

  1. 哈希表法和双指针法的区别是什么?
    哈希表法利用哈希表快速查找元素,而双指针法依靠指针的移动来遍历数组。哈希表法在元素分布均匀时效率更高,而双指针法在数组较小或有序时效率更高。

  2. 如何处理两个数组中元素数量相差较大的情况?
    如果两个数组中元素数量相差较大,哈希表法效率会更高,因为它可以快速过滤掉较小数组中不存在的元素。

  3. 如果两个数组中存在重复元素怎么办?
    哈希表法可以自动处理重复元素,而双指针法需要额外的逻辑来处理。

  4. 这道题目可以用其他方法解决吗?
    可以,还可以使用位运算或排序加二分查找等方法。

  5. LeetCode 中还有哪些类似的题目?
    LeetCode 中还有许多类似的题目,例如「两个数组的交集」、「两个数组的差集」、「两个数组的并集」等,都考察了集合论和算法基础。