LeetCode350-两个数组的交集 | 算法练习系列

259 阅读2分钟

这是我参与11月更文挑战的第15天,活动详情查看:2021最后一次更文挑战

前言

今天继续来一道js算法题,两个数组的交集II,这和LeetCode上的349题极其相似,都又有所不同,本文将用使用哈希表来解决这道题,下面先看题干

题目描述

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

示例 1:

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

输出:[2,2]

示例 2:

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

输出:[4,9]  

说明:

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

解题思路

  • 本题是要求两个数组的交集,也就是两个数组中所含的相同项,本题再这里提出两种方法,分别是排序指针和哈希表法
  • 首先排序指针是先把两个数组进行排序,然后声明两个指针a和b,分别指向两个数组,接着开始移动,还是三种情况,如果a所指的项大于b指的项,那么b指针移动,如果a所指项小于b所指,那么移动a指针,如果a指针和b指针所指相同,push进result数组,那a,b指针同时移动,直至结束
  • 哈希表法是先通过循环把一个数组中的所有项存入到哈希表中,其中各项值为哈希表中的键,哈希表中的值为同一个数组出现的次数,也就是说,假如第一个数组是[1,2,3,3,1],那么存入哈希表后的结果就是{1:2,2:1,3:2},然后再循环第二个数组,拿到每一项看哈希表中是否存在如果存在了就push进result数组,并且对应键的值减一,直至结束,这是result中的值就是我们所求答案,下面上代码
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersect = function(nums1, nums2) {
    let map = {} //声明一个哈希map,用来存放nums1中各个数组出现的次数
    let result = []
    for(let num1 of nums1){ //把nums1中的每一项插入到map中
        if(map[num1]){
            map[num1]++
        }else{
            map[num1] = 1
        }
    }
    for(let num2 of nums2){
        if(map[num2]>0){//这里大于0说明map中已经存在了当前数组,也就是说nums1中有这个数字
            result.push(num2)
            map[num2]--
        }
    }
    return result
};

总结

本题的解题思路是通过哈希map的数据结构特性来解决问题,本题的解题方法比较多,我之所以用哈希表来解决是因为这个方法不常用到,这里联系一下,如有高见欢迎评论赐教,gogogo!!!