题目简述:求两个数组的交集
解法一
/**
* @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));
};
- 根据nums1生成hash表
- 遍历nums2,如果遍历的内容存在于 nums1 的 hash表 中,加到结果hash中
- 使用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);
};
- 处理两个数组,过滤掉重复的内容,减少遍历次数,生成两个新的Set
- 判断两个Set哪个内容少,以少的内容进行遍历,将重复的元素添加到结果集Set中
- 通过Set的迭代器返回遍历结果