tailgo / poorguy-fly

1 stars 0 forks source link

350. 两个数组的交集 II https://leetcode-cn.com/problems/intersection-of-two-arrays-ii/ #21

Open AmelloAster opened 4 years ago

AmelloAster commented 4 years ago

题目

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

示例 1:


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

示例 2:

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

说明:

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

如果给定的数组已经排好序呢?你将如何优化你的算法? 如果 nums1 的大小比 nums2 小很多,哪种方法更优? 如果 nums2 的元素存储在磁盘上,磁盘内存是有限的,并且你不能一次加载所有的元素到内存中,你该怎么办?

解题代码

var intersect = function (nums1, nums2) {
    let minA = nums1.length >= nums2.length ? nums2 : nums1
    let maxA = nums1.length < nums2.length ? nums2 : nums1

    let minR = {}
    let maxR = {}

    maxA.forEach((i, d) => {
        if (minA[d] !== undefined) {
            if (!minR[minA[d]]) {
                minR[minA[d]] = {
                    val: minA[d],
                    c: 1,
                }
            } else {
                minR[minA[d]].c++
            }
        }
        if (!maxR[i]) {
            maxR[i] = {
                val: i,
                c: 1,
            }
        } else {
            maxR[i].c++
        }
    })
    let minArr = Object.values(minR)
    let maxArr = Object.values(maxR)
    let array = []
    minArr.forEach(i => {
        let target = maxArr.find(r => r.val === i.val)
        if (target) {
            if (i.c > target.c) {
                array.push(...new Array(target.c).fill(i.val))
            } else {
                array.push(...new Array(i.c).fill(i.val))
            }
        }
    })
    return  array;
}

解题思路

给两个数组创建两个对象记录每个元素出现的次数
然后对比两个对象重复出现的值得次数
创建一个新数组整理答案

解题效率

执行结果:
通过
显示详情
执行用时:104 ms, 在所有 JavaScript 提交中击败了8.55%的用户
内存消耗:
36.9 MB, 在所有 JavaScript 提交中击败了12.50%的用户