【算法】数组:两个数组的交集 II

118 阅读2分钟

题目:两个数组的交集 II

leetcode链接:初级算法 - 两个数组的交集 II

说明:给你两个整数数组 nums1 和 nums2 ,请你以数组形式返回两数组的交集。返回结果中每个元素出现的次数,应与元素在两个数组中都出现的次数一致(如果出现次数不一致,则考虑取较小值)。可以不考虑输出结果的顺序。

理解:

1、有两个整数数组,以数组形式返回它们的交集(共有的元素)

2、如果某个元素在两个数组都出现了,但是出现的次数不一致,那么取出现次数较少的那个

3、可以不考虑交集中元素的顺序

思路:

1、使用map分别存储两个数组内各元素出现的次数,然后比较相同元素出现的个数,之后取较小的那个并完成数据的填充,最终返回填充后的数组即可。

2、数组和双指针,先对两个数组进行排序,然后利用双指针将相同的元素添加到数组并最终返回该数组即可

题解:

方案一、利用map

/**
 * @param {number[]} list
 * @return {obj} 
 */
var getMap = function(list = []) {
   var obj = {}
    if (list.length) {
        for(var i = 0; i < list.length; i++) {
            if (!obj[list[i]]) {
                obj[list[i]] = 1
            } else {
                obj[list[i]] += 1
            }
        }
    }

    return obj
}

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    var map1 = getMap(nums1)
    var map2 = getMap(nums2)
    var arr = []
    for (let key in map1) {
        if (map2[key]) {
            if (map2[key] <= map1[key]) {
                let list = new Array(map2[key])
                list.fill(key)
                arr.push(...list)
            } else {
                let list = new Array(map1[key])
                list.fill(key)
                arr.push(...list)
            }
        }
    }
    return arr
}; 

image.png

方案二、数组和双指针

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    nums1.sort((n1, n2) => n1 - n2)
    nums2.sort((n1, n2) => n1 - n2)
    var arr = []
    let i = 0;
    let j = 0;
    while (i < nums1.length && j < nums2.length) {
        if (nums1[i] < nums2[j]) {
            // 如果i指向的值小于j指向的值,,说明i指向
            // 的值小了,i往后移一步
            i++;
        } else if (nums1[i] > nums2[j]) {
            // 如果i指向的值大于j指向的值,说明j指向的值
            // 小了,j往后移一步
            j++;
        } else {
            // 如果i和j指向的值相同,说明这两个值是重复的,
            // 把他加入到集合list中,然后i和j同时都往后移一步
            arr.push(nums1[i]);
            i++;
            j++;
        }
    }
    return arr
};

image.png

总结:

本篇主要实现了两个数组交集的两种解法,如果我们稍微留意会发现跟前面刷过的有些算法思路差不多,只是在实现方式上有所区别,我想这些沉淀来下的东西,会是我们宝贵的经验。