# 349 两个数组的交集

# 题目

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

示例 1:

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

示例 2:

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

说明:

输出结果中的每个元素一定是唯一的。 我们可以不考虑输出结果的顺序。

# 题解

TIP

执行用时:72 ms, 在所有 JavaScript 提交中击败了 95.71% 的用户
内存消耗:38.7 MB, 在所有 JavaScript 提交中击败了 33.18% 的用户
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let set2 = new Set(nums2)
    let result = new Set()
    nums1.forEach(item => {
        set2.has(item) && result.add(item)
    })
    return [...result]
};
  • 时间复杂度: `O(n^2)`,使用 forEach循环和has方法,n 为 nums1 的长度,
  • 空间复杂度: `O(n)`,使用两个变量来保存值
  • 最好情况:
  • 最坏情况:
  1. 通过 while循环一次遍历 nums2 里的每一个元素,其他同上

TIP

执行用时:92 ms, 在所有 JavaScript 提交中击败了 43.4% 的用户
内存消耗:38.8 MB, 在所有 JavaScript 提交中击败了 30.09% 的用户
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let l = nums2.length
    let result = new Set()
    while(l--) {
        nums1.includes(nums2[l]) && result.add(nums2[l])
    }

    return [...result]
};
  • 时间复杂度: `O(n^2)`,使用 while循环和 includes 方法
  • 空间复杂度: `O(n)`,使用一个变量来保存值
  • 最好情况:
  • 最坏情况:
  1. 第一次遍历 nums1 里面的元素,把每一项放到 hash 里面,第二次遍历 nums2,把结果存放到 Set 里面。

TIP

执行用时:80 ms, 在所有 JavaScript 提交中击败了 83.39% 的用户
内存消耗:38.7 MB, 在所有 JavaScript 提交中击败了 32.26% 的用户
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let l1 = nums1.length
    let l2 = nums2.length
    let hash = []
    let result = new Set()
    while(l1--) {
        hash[nums1[l1]] = nums1[l1]
    }

    while(l2--) {
        if(hash[nums2[l2]] != undefined) {
            result.add(nums2[l2])
        }
    }

    return [...result]
};
  • 时间复杂度: `O(n)`,分别使用两个 while循环,第二个 while循环里面使用`O(1)`的方法去判断是否存在元素
  • 空间复杂度: `O(n)`,使用两个变量来保存值
  • 最好情况:
  • 最坏情况:
  1. 与上面不同的是,第二个 while循环利用了双指针去判断元素是否存在

TIP

执行用时:68 ms, 在所有 JavaScript 提交中击败了 98.28% 的用户
内存消耗:38.4 MB, 在所有 JavaScript 提交中击败了 46.73% 的用户
/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function(nums1, nums2) {
    let l1 = nums1.length
    let l2 = nums2.length
    let hash = []
    let result = new Set()
    while(l1--) {
        hash[nums1[l1]] = nums1[l1]
    }

    let left = 0, right = l2
    while(left <= right) {
        if(hash[nums2[left]] != undefined) {
            result.add(nums2[left])
        }
        if(hash[nums2[right]] != undefined) {
           result.add(nums2[right]) 
        }
        
        left++
        right--
    }

    return [...result]
};
  • 时间复杂度: `O(n)`,分别使用两个 while循环,第二个 while循环里面使用`O(1)`的方法去判断是否存在元素
  • 空间复杂度: `O(n)`,使用两个变量来保存值
  • 最好情况:
  • 最坏情况:
最后更新时间: 10/5/2020, 6:32:00 PM