#两个数组的交集

🔗 LeetCode

给定两个数组 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

#解题思路

题目信息:数组长度和大小都近乎 1000,哈希不能用数组,返回每个元素唯一,可以用 set

#思路一

使用 api 和工具快速实现,业务常用

#思路二

使用 遍历长数组 set 哈希缓存,遍历短数组获取结果,复杂度 O(n)

#首次代码

function intersection(nums1: number[], nums2: number[]): number[] {
  return unique(nums1.filter((i) => nums2.includes(i)))
}

function unique<T>(arr: T[]) {
  return Array.from(new Set(arr))
}

#优化代码

function intersection(nums1: number[], nums2: number[]): number[] {
  const longSet = new Set<number>()
  const resSet = new Set<number>()

  let long: number[]
  let short: number[]
  if (nums1.length > nums2.length) {
    long = nums1
    short = nums2
  } else {
    long = nums2
    short = nums1
  }

  for (let i = 0; i < long.length; i++) {
    longSet.add(long[i])
  }

  for (let i = 0; i < short.length; i++) {
    if (longSet.has(short[i])) {
      resSet.add(short[i])
    }
  }

  return Array.from(resSet)
}