LeetCode349 两个数组的交集
题目
解题
解题一:哈希表
// javascript
const set_intersection = (set1, set2) => {
if (set1.size > set2.size) {
return set_intersection(set2, set1);
}
const intersection = new Set();
for (const num of set1) {
if (set2.has(num) === true) {
intersection.add(num);
}
}
return [...intersection];
}
var intersection = function(nums1, nums2) {
const set1 = new Set(nums1);
const set2 = new Set(nums2);
return set_intersection(set1, set2);
};
解题二:排序 + 双指针
处理重复元素的问题 「排序 + 双指针」也是很常见的用法。
// javascript
var intersection = function(nums1, nums2) {
const n1 = nums1.length, n2 = nums2.length;
const res = new Array();
nums1.sort((a, b) => a - b);
nums2.sort((a, b) => a - b);
let i = 0, j = 0;
while (i < n1 && j < n2) {
// 在 nums1 里找到一个新的数字(不与之前的元素重复)
if (i === 0 || nums1[i] !== nums1[i - 1]) {
// 跳过 nums2 中比 nums1[i] 小的元素
while (j < n2 && nums2[j] < nums1[i]) {
++j;
}
// nums2[j] >= nums1[i],如果等于就将其 push 进 res
if (nums2[j] === nums1[i]) {
res.push(nums2[j]);
// ++j 可加可不加,因为下次 nums1 里找到的新值必然大于该数,该数会在上面的 while 循环中被跳过
// ++j;
}
}
++i;
}
return res;
};
官方的思路是 在两个数组中找相等的值,再利用 返回的结果中不能有重复的元素的特点: 如果 x = y 时 x 已经被加入 res(res 中最后一个值等于 x),那就不加入,否则加入。接着移动指针去比较下一对值。
// javascript
var intersection = function(nums1, nums2) {
const n1 = nums1.length, n2 = nums2.length;
const res = new Array();
nums1.sort((a, b) => a - b);
nums2.sort((a, b) => a - b);
let i = 0, j = 0, length = 0;
while (i < n1 && j < n2) {
const x = nums1[i], y = nums2[j];
if (x === y) {
if (length === 0 || x !== res[length - 1]) {
res[length++] = x;
}
++i;
++j;
} else if (x < y) {
++i;
} else {
++j;
}
}
return res;
};