「leetcode」 349.两个数组的交集;350.两个数组的交集 II

1,703 阅读2分钟

前言

349题和350题思路类似,都是利用Hash,所以放在了一起解析。

349.两个数组的交集

原题

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

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]

说明:

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

思路

我们首先循环nums1数组,使用nums1数组中的每一个子项,作为key,value设置为true,构建hash表。

接着我们循环nums2数组,使用hash表对nums2中的每一个子项查询。如果nums2的子项存在于hash表中,说明子项与nums1存在交集,将子项push进结果数组即可。接着我们将hash表中对应的value设置为false,避免重复的元素push进结果数组中。

代码


/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let hashMap = {}
    
    let result = []
    
    for (let i = 0; i < nums1.length; i++) {
        if (!hashMap[nums1[i]]) {
            hashMap[nums1[i]] = true
        }
    }
    
    for (let i = 0; i < nums2.length; i++) {
        if (hashMap[nums2[i]]) {
            result.push(nums2[i])
            hashMap[nums2[i]] = false
        }
    }
    
    return result
};

350.两个数组的交集 II

原题

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

示例 1:

输入: nums1 = [1,2,2,1], nums2 = [2,2]
输出: [2,2]

示例 2:

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [4,9]

说明:

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

思路

思路同349题类似,不同是我们需要在hash表中记录每一个元素出现的次数。

当我们循环nums2时,每次nums2与nums1产生交集时,我们将hash表中记录自减一,当hash表的某一项减至0时,说明nums1不会与nums2产生重复的交集了,我们就无需再将重复的子项push进结果数组中了。

代码


/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    let hashMap = {}
    let result = []
    
    for (let i = 0; i < nums1.length; i++) {
        if (!hashMap[nums1[i]]) {
            hashMap[nums1[i]] = 1
        } else {
            hashMap[nums1[i]] += 1
        }
    }
    
    for (let i = 0; i < nums2.length; i++) {
        if (hashMap[nums2[i]]) {
           result.push(nums2[i])
           hashMap[nums2[i]] -= 1 
        }
    }
    
    return result
};