leetcode-数组-349.-两个数组的交集

135 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情

Hi, 大家好。我是新人,程序员库里。

今后会按类分享算法题。

今天给大家分享第15道leetcode上数组中使用双指针相关的算法题。

349. 两个数组的交集

leetcode地址:leetcode-cn.com/problems/in…

难度

简单

描述

给定两个数组 nums1 和 nums2 ,返回 它们的交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。

示例1

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

示例2

输入: nums1 = [4,9,5], nums2 = [9,4,9,8,4]
输出: [9,4]
解释: [4,9] 也是可通过的

提示:

  • 1 <= nums1.length, nums2.length <= 1000
  • 0 <= nums1[i], nums2[i] <= 1000

解法1

  1. 属于查找表的问题
  2. 首页使用set将两个数组去重
  3. 定义变量set1存储去重后的nums1,定义变量set2存储去重后的nums2
  4. 定义变量res,来存储两个数组的交集
  5. 使用for ...of 遍历 set1的keys,判断如果当set2中包含当当前遍历的key,说明这个key是两个数组的交集,就把当前的key添加到res中
  6. 最后res存储的就是两个数组的交集,最后返回res.

解法2

新建一个字典,遍历nums1, 填充字典 遍历nums2,遇到字典里的值就选出,并从字典中删除

解法3

首先将数组排序 定义一个数组保存结果result 两个指针分别指向两个数组的头部,每次比较两个指针指向的两个数组中的数字,如果两个数字不相等,则将指向较小数字的指针右移一位。如果两个数字相等,且该数字不等于result的尾部元素,同时将两个指针都右移一位。当至少有一个指针超出数组范围时,遍历结束 解释下为啥与result的尾部元素比较,因为数组nums1,nums2是经过升序排序的,所以result也必然是升序的,所以新遍历的元素如果不等于result尾部元素,必然大于尾部元素,且不会与result内元素重复(因为是升序的)。

代码

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let set1 = new Set(nums1);
    let set2 = new Set(nums2);

    let res = [];
    for(let key of set1.keys()){
        if(set2.has(key)){
            res.push(key)
        }
    }
    return res;
};