一、题目描述
给定两个数组,编写一个函数来计算它们的交集。
输入:nums1 = [1,2,2,1], nums2 = [2,2]
输出:[2]
二、思路分析
这道题看上去不是特别难,但是我们可以尝试用多个方法去尝试做
第一种方法 我们通过多声明一个对象,帮助我们存放我们第一次循环过num1的元素,然后通过这个对象,帮助我们判断,num2中与num1中元素的交集关系。
第二种方法类似于双指针法,这个方法需要我们去给两个数组进行排序,然后我们去声明两个指针,同时走,因为我们已经排序过了,就可以通过右移找到交集
三、AC代码
const intersection = (nums1, nums2) => {
const map = {};
const res = [];
for (const num1 of nums1) {
map[num1] = true; // 记录nums1出现过的数字
}
for (const num2 of nums2) {
if (map[num2]) { // 如果nums2的这个数字在nums1出现过
map[num2] = false; // 置为false,避免重复推入res
res.push(num2); // 交集数字推入res
}
}
return res;
};
// 双指针法
var intersection = function(nums1, nums2, p1 = 0, p2 = 0, r = []) {
nums1.sort((a, b) => a - b)
nums2.sort((a, b) => a - b)
while (p1 < nums1.length && p2 < nums2.length)
if (nums1[p1] === nums2[p2]) r[r.length - 1] !== nums1[p1] && r.push(nums1[p1]), p1++, p2++
else if (nums1[p1] < nums2[p2]) p1++
else p2++
return r
};
四、总结
当我们可以比较轻松的去对一道题解出来之后,我们就可以多想一想,有没有更好的方法,让我们不断加强我们的算法能力吧!