每日一题:每天一个新挑战;
循序渐进:从易到难,扎实掌握;
系统分类:按数据结构分类,有助于构建知识框架;
丰富题量:100 道精选题,覆盖简单/中等/困难难度。
给定两个数组 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] 也是可通过的
提示:
- 1 <= nums1.length, nums2.length <= 1000
- 0 <= nums1[i], nums2[i] <= 1000
代码卡片

分析/求解
给定两个数组 nums1 和 nums2,我们需要找出它们的交集,且输出结果中的每个元素必须是唯一的,并且不考虑输出顺序。
方法一:使用集合(Set)
- 使用集合(Set)来去重:首先将 nums1 转换为一个集合 set1,将 nums2 转换为另一个集合 set2。
- 利用集合的交集操作,找出 set1 和 set2 的交集元素,并将其转换为数组返回。
- 时间复杂度:O(n + m),其中 n 和 m 分别是 nums1 和 nums2 的长度。转换集合和查找交集都需要线性时间。
- 空间复杂度:O(n + m),我们使用了两个集合来存储数组的唯一元素。
var intersection = function (nums1, nums2) {
let set1 = new Set(nums1);
let set2 = new Set(nums2);
return [...set1].filter(num => set2.has(num));
}
方法二:双指针法(针对已排序的数组)
- 将两个数组排序,然后使用双指针法找到它们的交集。
- 两个指针分别从两个数组的起始位置开始,比较当前指向的元素:
- 如果相等,加入结果集,并同时移动两个指针。
- 如果 nums1[i] 小于 nums2[j],移动 i 指针。
- 否则,移动 j 指针。
- 确保结果集的唯一性,避免重复元素的出现。
- 时间复杂度:O(n log n + m log m),由于对两个数组进行了排序。
- 空间复杂度:O(1),除了输出结果外,没有使用额外的空间。
var intersection = function (nums1, nums2) {
nums1.sort((a, b) => a - b);
nums2.sort((a, b) => a - b);
let i = 0, j = 0;
let result = [];
while (i < nums1.length && j < nums2.length) {
if (nums1[i] === nums2[j]) {
if (result.length === 0 || result[result.length - 1] !== nums1[i]) {
result.push(nums1[i]);
}
i++;
j++;
} else if (nums1[i] < nums2[j]) {
i++;
} else {
j++;
}
}
return result;
}
总结
通过使用集合或双指针方法,可以有效地找到两个数组的交集。使用集合方法较为直观且简单,而双指针方法在处理已排序数组时性能更优(面试时最好使用多种方法求解)。
发布者:股市刺客,转载请注明出处:https://www.95sca.cn/archives/289000
站内所有文章皆来自网络转载或读者投稿,请勿用于商业用途。如有侵权、不妥之处,请联系站长并出示版权证明以便删除。敬请谅解!