zhangdizhangdi

349.两个数组的交集 🟩

题目

LeetCode 简单

题目

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

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

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

题解

方法:集合Set

复杂度

时间复杂度:O(m+n)

其中 m 和 n 分别是两个数组的长度。使用两个集合分别存储两个数组中的元素需要 O(m+n) 的时间,遍历较小的集合并判断元素是否在另一个集合中需要 O(min(m,n)) 的时间,因此总时间复杂度是 O(m+n)。

空间复杂度:O(m+n)

其中 m 和 n 分别是两个数组的长度。空间复杂度主要取决于两个集合。

js
function intersection(nums1, nums2) {
  let resSet = new Set(),
    nums1Set = new Set(nums1)
  for (let i of nums2) {
    if (nums1Set.has(i)) {
      resSet.add(i)
    }
  }
  return Array.from(resSet)

  //简化
  // return [...new Set(nums1.filter(item => nums2.includes(item)))]
}

const nums1 = [4, 9, 5]
const nums2 = [9, 4, 9, 8, 4]
console.log('🌰', intersection(nums1, nums2))
执行结果
🌰 [ 9, 4 ]

方法:排序 + 双指针

复杂度

时间复杂度:O(mlogm+nlogn)

其中 m 和 n 分别是两个数组的长度。对两个数组排序的时间复杂度分别是 O(mlogm) 和 O(nlogn),双指针寻找交集元素的时间复杂度是 O(m+n),因此总时间复杂度是 O(mlogm+nlogn)。

空间复杂度:O(logm+logn)

其中 m 和 n 分别是两个数组的长度。空间复杂度主要取决于排序使用的额外空间。

js
function intersectionUseTwoPointers(nums1, nums2) {
  nums1.sort((a, b) => a - b)
  nums2.sort((a, b) => a - b)

  let i1 = 0,
    i2 = 0,
    result = []
  while (i1 < nums1.length && i2 < nums2.length) {
    if (nums1[i1] === nums2[i2]) {
      if (result.indexOf(nums1[i1]) === -1) {
        result.push(nums1[i1])
      }
      i1++
      i2++
    }
    if (nums1[i1] < nums2[i2]) {
      i1++
    }
    if (nums1[i1] > nums2[i2]) {
      i2++
    }
  }
  return result
}

const nums1 = [1, 2, 2, 1],
  nums2 = [2, 2]
console.log('🌰', intersectionUseTwoPointers(nums1, nums2))
执行结果
🌰 [ 2 ]