如何求两个数组的交集

726 阅读2分钟

题目描述

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

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[9,4]
说明:

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

解答

首先对nums1进行遍历,将遍历结果存储在map中,然后针对nums2进行遍历,如果nums2中的元素在map中出现了,就存储下来,即可或得两个数组的交集。

function intersection(nums1, nums2) {
    const map = new Map()
    // 对nums1进行遍历存储在map中,通过map进行查找的速度会快很多
    for (const num of nums1) {
        map.set(num, true)
    }

    let k = 0;
    for (const num of nums2) {
        const value = map.get(num)
        if (value) {
            nums2[k] = num
            k++
            map.set(num, false)
        }
    }

    return nums2.slice(0, k)
}

变型

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

示例 1:
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2,2]
示例 2:
输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出:[4,9]
说明:

输出结果中每个元素出现的次数,应与元素在两个数组中出现次数的最小值一致。我们可以不考虑输出结果的顺序。

变型解答

此题和上一题非常相似,不同之处在于重复的数据需要重复展示,这样我们在存储map的时候就不能简单的true表示,需要进行计数,其余步骤相同。

function intersection(nums1, nums2) {
    const map = new Map()
    for (const num of nums1) {
        const value = map.get(num) || 0
        map.set(num, value + 1)
    }

    let k = 0;
    for (const num of nums2) {
        const value = map.get(num)
        if (value > 0) {
            nums2[k] = num
            k++
            map.set(num, value - 1)
        }
    }

    return nums2.slice(0, k)
}

进阶

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

示例:
输入: 排序数组 nums1 = [1,2,3,4,5], nums2 = [3,4,6,7]
输出: [3,4]

进阶解答

此题我们可以通过双指针来解,不断的移动index1和index2,进行对应元素的比较

function intersection(nums1, nums2) {
    let index1 = 0
    let index2 = 0

    const intersection = []
    while(index1 < nums1.length && index2 < nums2.length) {
        if (nums1[index1] === nums2[index2]) {
            // 当两者相等的时候,intersection中为空的时候直接塞进去,或者当元素和最后一个元素不相等的时候塞进去
            if (!intersection.length || nums1[index1] !== intersection[intersection.length - 1]) {
                intersection.push(nums1[index1])
                index1++
                index2++
            }
        } else if (nums1[index1] > nums2[index2]) {
            // 当nums1[index1] > nums2[index2]的时候,index2++
            index2++
        } else {
            index1++
        }
    }
    return intersection
}