哈希表-349两个数组的交集

77 阅读1分钟

题目描述

给定两个数组 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] 也是可通过的

题解思路

这道题也可以用暴力破解,两层for循环即可解决

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
const intersection = function (nums1, nums2) {
  // 暴力破解 时间复杂度 O(m * n)
  let res = [];
  for (let i = 0; i < nums1.length; i++) {
       const num1 = nums1[i];
       for (let j = 0; j < nums2.length; j++) {
           const num2 = nums2[j];
           if (num1 === num2 && !res.includes(num1)) {
               res.push(num1);
           }
       }
   }
   return res;
};

使用哈希表,这里我使用 js 中 Set 这种数据结构,因为它在查找的数据的时候时间复杂度是 O(1),算法整体时间复杂度是 O(n),n 的值是两个数组中长度最大的那个值。

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
const intersection = function (nums1, nums2) {
  // 将 nums1 作为最长的数组去遍历,防止遗漏元素
  if (nums1.length < nums2.length) {
    const temp = nums1;
    nums1 = nums2;
    nums2 = temp;
  }
  // 定义 res 的时候使用 Set,对 res 去重
  const res = new Set();
  // 定义 set2 对 nums2 去重
  const set2 = new Set(nums2);
  // 遍历 nums1,对元素进行检查
  for (let i = 0; i < nums1.length; i++) {
    if (set2.has(nums1[i])) {
      res.add(nums1[i]);
    }
  }
  // 最后这里需要返回一个数组
  return [...res];
};