LeetCode 349. 两个数组的交集

61 阅读1分钟

349. 两个数组的交集

题目简述:求两个数组的交集

解法一

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function (nums1, nums2) {
  const nums1Hash = {};
  for (let i = 0; i < nums1.length; i++) {
    let item = nums1[i];
    if (!nums1Hash[item]) {
      nums1Hash[item] = 1;
    }
  }

  const xHash = {};

  for (let i = 0; i < nums2.length; i++) {
    let item = nums2[i];
    if (nums1Hash[item]) {
      xHash[item] = 1;
    }
  }

  return Object.keys(xHash).map((item) => Number(item));
};
  1. 根据nums1生成hash表
  2. 遍历nums2,如果遍历的内容存在于 nums1 的 hash表 中,加到结果hash中
  3. 使用Object.keys遍历hash表,再用map返回成数字类型的结果

小结:自己写的就是蠢,生成两个hash表,还用Object.keys 和 map 处理结果,时间复杂度爆炸

解法二:使用js 的Set处理

const set_intersection = (set1, set2) => {
  if (set1.size > set2.size) {
    return set_intersection(set2, set1);
  }
  const res = new Set();
  for (const num of set1) {
    if (set2.has(num)) {
      res.add(num);
    }
  }
  return [...res];
};

var intersection = function (nums1, nums2) {
  const set1 = new Set(nums1);
  const set2 = new Set(nums2);
  return set_intersection(set1, set2);
};
  1. 处理两个数组,过滤掉重复的内容,减少遍历次数,生成两个新的Set
  2. 判断两个Set哪个内容少,以少的内容进行遍历,将重复的元素添加到结果集Set中
  3. 通过Set的迭代器返回遍历结果