数组「3」两个数组的交集 II|刷题打卡

127 阅读2分钟

前言

今天阳光明媚,春暖花开,特别适合打卡学习哦~

今日题目

leecode350.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]


说明:

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

题目分析 本题说明不考虑输出结果的顺序,其实就是数学中交集的概念,可以理解为找出两个数组中相同的数字,并且重复次数一致

解题思路

思路一: Map

首先用map记录第一个数组每一个数字出现的次数,然后遍历第二个数组,如果发现在map中,那就说明该数字是交集中的数字,需要保存下来,并且该数字在map中的次数减1。

var intersect = function(nums1, nums2) {
    const map = new Map()
    const result = []
    for(let i = 0; i < nums1.length; i++) {
        if (map[nums1[i]]) {
            map[nums1[i]]++
        } else {
            map[nums1[i]] = 1
        }
    }
    for (let i = 0; i < nums2.length; i++) {
        if (map[nums2[i]] > 0) {
            result.push(nums2[i])
            map[nums2[i]]--
        }
    }
    return result
};

思路二:先排序再双指针

将两个数组按从小到大排序后,分别用一个指针指向第一个位置并比较,如果两个数字相同,则存到结果中,如果两个数字不同,较小的一个数组指针移动一位,直到某一个数组查询结束。

var intersect = function(nums1, nums2) {
    const result = []
    nums1.sort((a, b) => a - b) // 从小打大排序
    nums2.sort((a, b) => a - b)
    let p1 = 0
    let p2 = 0
    //  一个数组查询完就结束
    while(p1 < nums1.length && p2 < nums2.length) {
        if (nums1[p1] < nums2[p2]) {
            p1++
        } else if (nums1[p1] > nums2[p2]) {
            p2++
        } else {
        	result.push(nums1[p1])
            p1++
            p2++
        }
    }
    return result
};

总结

3月第5天,每天写一篇题解理清自己的思路,巩固知识点。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看活动详情