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

499 阅读2分钟

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

前言

每人js算法题一更,今天依旧是一道数组相关的简单难度算法题,两个数组的交集,这里的交集是相同元素的意思,我们下面看下题目

题目描述

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

 

示例 1:

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

输出:[2]

示例 2:

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

输出:[9,4]

解题思路

  • 这题的题干想当的简单,短短的两句话,大致意思就是求出两个数组中存在的相同项,并且这个值不能重复
  • 这道题可以直接通过循环一个数组,来判断另一个数组中是否有这个数字,如果有就放进result数组中,直至循环结束输出result即可
  • 另一种方法是首先把两个数组进行排序,然后声明两个指针,分别指向两个数组,由于是排序过的数组,就只有三种情况,一种是指针一的数字大于指针二指向的数字,这时指针二移动就行,一种是指针一指向数字小于指针二的数字,那这时指针一移动就可以了,再着就是如果两个指针指向的数字相等,那就push进结果数组
  • 这里要主要的一点是如果使用的是第二种方法,那记得再使用的时候每次移动之前一定要判断一下当前项和前一项是否相同,如果相同就再向后移动指针,直至到和之前项不相同的位置
  • 大致就是这两种思路,下面上第一种思路的代码
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    const a = nums1.length
    const b = nums2.length
    let result = []
    //这里会分两种情况,这样做的原因是我们只需要循环短的那个数组的次数就行了
    if(a<b){
        for(let i=0;i<a;i++){
           if(nums2.indexOf(nums1[i])!==-1){
               result.push(nums1[i])
           }
        }
    }else{
         for(let i=0;i<b;i++){
           if(nums1.indexOf(nums2[i])!==-1){
               result.push(nums2[i])
           }
        }
    }
    return Array.from(new Set(result)) //在这里我们直接用Set()的去重属性直接把得到的数组中的重复项给去掉
};

总结

这道题看起来很简单,但其中的解题方法还是有很多种的,这里我只说了两种我第一时间想到的,并且也只给出了第一种思路的代码,第二种的代码在这里就不贴出来了,平时我们遇到数组问题一定要往两个方面想,一个是指针,一个是排序,一般的数组问题在这两个方向上都能解决,gogogo!!!