349. 两个数组的交集
题目描述
给定两个数组 nums1 和 nums2 ,返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。
输入/输出示例
bash
示例 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] 也是可通过的
关键思路
解法1
- 将一个数组转成Set去重,遍历另一个数组,看其值是不是在Set中。
- 这样的问题就是结果可能存在重复,所以结果也要用Set处理
JS代码实现
javascript
const intersection = (nums1, nums2) => {
const set1 = new Set(nums1);
const result = new Set();
for (const num of nums2) {
if (set1.has(num)) {
result.add(num);
}
}
return Array.from(result);
};
复杂度分析
- 时间复杂度:O(m + n)
- 空间复杂度:O(min(m, n))
解法2
- 将两个数组都转出Set,如此,两个Set中,都不存在重复元素。
JS代码实现
javascript
const intersection = (nums1, nums2) => {
const set1 = new Set(nums1);
const set2 = new Set(nums2);
const result = [];
for (const num of set1) {
if (set2.has(num)) {
result.add(num);
}
}
return result;
}
复杂度分析
- 时间复杂度:O(m + n)
- 空间复杂度:O(m + n)
两种算法对比
- 两种算法没有太大的区别,算法1只将一个数组转成了Set,空间利用上较好。
- 算法2将两个数组都转成了Set,当两个数组很长,且存在重复元素时,该算法较优。
结语
本文主要介绍了LeetCode第349题两个数组的交集的解法,你还知道这题的其他解法吗?欢迎在评论区留言分享!