「LeetCode 350」两个数组的交集II

95 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

两个数组的交集 II

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

测试用例

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

题目地址(https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/)

题目说明

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

代码实现

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    const hashTable = {};
    let target = [];
    nums1.forEach(v => {
        if(hashTable[v]) hashTable[v]++;
        else hashTable[v] = 1;   
    })
    nums2.forEach(v => {
        if(hashTable[v] && hashTable[v] > 0) {
            hashTable[v]--;
            target.push(v);
        }
    })
    return target;
};

解题思路

本题使用哈希表的方式来解答,而 JS 中对象也是以 HashTable 进行存储的,便可以直接利用 JS 对象来实现哈希表,请注意题目要求结果中每个元素出现的次数应与元素在两个数组中出现次数的最小值一致,根据这个要求那么需要在哈希表中记录值出现的次数,首先定义一个 HashTable 用以记录值的出现次数,然后定义 target 目标数组,接着将第一个数组 nums1 进行遍历,在哈希表中如果没有定义这个 key ,那么就将这个 key 的值设置为 1 ,如果已经定义了,那么就将其值自增,然后遍历第二个数组 nums2 ,直接判断在哈希表中是否定义该 key ,如果定义了且其计数值大于 0 的话 ,那么就将哈希表中该 key 的计数值自减,然后将该 key 推入 target 目标数组,循环结束后返回 target 目标数组即可。