349.两个数组的交集

题目

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

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

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

说明:

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

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/intersection-of-two-arrays 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

JS实现

1、排序 + 双指针

/**
 * @param {number[]} nums1
 * @param {number[]} nums2
 * @return {number[]}
 */
var intersection = function (nums1, nums2) {
  const result = [];

  //分别对两个数组排序(从小到大)
  nums1.sort((a, b) => a - b);
  nums2.sort((a, b) => a - b);

  const len1 = nums1.length,
    len2 = nums2.length;
  //双指针
  let index1 = 0,
    index2 = 0;

  while (index1 < len1 && index2 < len2) {
    const num1 = nums1[index1],
      num2 = nums2[index2];
    //如果两数相等
    if (num1 === num2) {
      //如果结果数组为空 或者 结果数组最后一个元素与num1不相等,则添加到结果数组
      if (result.length === 0 || num1 != result[result.length - 1]) {
        result.push(num1);
      }
      index1++;
      index2++;
    } else if (num1 < num2) {
      index1++;
    } else {
      index2++;
    }
  }
  return result;
};

2、哈希表

var intersection = function (nums1, nums2) {
  const result = [];

  const map = new Map();
  //遍历nums1,加入hashmap
  for (let num of nums1) {
    map.set(num, true);
  }

  //遍历nums2,判断hashmap中是否存在,如存在,则加入结果集
  for (let num of nums2) {
    if (map.has(num)) {
      result.push(num);
    }
  }

  //去重
  return [...new Set(result)];
};

3、indexOf

var intersection = function (nums1, nums2) {
  const result = [];

  for (let i = 0; i < nums1.length; i++) {
    if (nums2.indexOf(nums1[i]) > -1) {
      result.push(nums1[i]);
    }
  }
  return [...new Set(result)];
};

4、Set

var intersection = function (nums1, nums2) {
  const result = [];

  const set1 = new Set(nums1);
  const set2 = new Set(nums2);

  for (let item of set1) {
    if (set2.has(item)) {
      result.push(item);
    }
  }

  return result;
};