题目描述
给定两个数组 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];
};